免费足网站,石家庄平台公司,泰安人才网档案查询,目前网站开发的主流语言是什么题目描述
小城和小华都是热爱数学的好学生#xff0c;最近#xff0c;他们不约而同地迷上了数独游戏#xff0c;好胜的他们想用数独来一比高低。但普通的数独对他们来说都过于简单了#xff0c;于是他们向 Z 博士请教#xff0c;Z 博士拿出了他最近发明的“靶形数独”最近他们不约而同地迷上了数独游戏好胜的他们想用数独来一比高低。但普通的数独对他们来说都过于简单了于是他们向 Z 博士请教Z 博士拿出了他最近发明的“靶形数独”作为这两个孩子比试的题目。
靶形数独的方格同普通数独一样在 99 格宽且 99 格高的大九宫格中有 99 个 33 格宽且 33 格高的小九宫格用粗黑色线隔开的。在这个大九宫格中有一些数字是已知的根据这些数字利用逻辑推理在其他的空格上填入 11 到 99 的数字。每个数字在每个小九宫格内不能重复出现每个数字在每行、每列也不能重复出现。但靶形数独有一点和普通数独不同即每一个方格都有一个分值而且如同一个靶子一样离中心越近则分值越高。如图 上图具体的分值分布是最里面一格黄色区域为 1010 分黄色区域外面的一圈红色区域每个格子为 99 分再外面一圈蓝色区域每个格子为 88 分蓝色区域外面一圈棕色区域每个格子为 77 分最外面一圈白色区域每个格子为 66 分如上图所示。比赛的要求是每个人必须完成一个给定的数独每个给定数独可能有不同的填法而且要争取更高的总分数。而这个总分数即每个方格上的分值和完成这个数独时填在相应格上的数字的乘积的总和
总分数即每个方格上的分值和完成这个数独时填在相应格上的数字的乘积的总和。如图在以下的这个已经填完数字的靶形数独游戏中总分数为 2829。游戏规定将以总分数的高低决出胜负。 由于求胜心切小城找到了善于编程的你让你帮他求出对于给定的靶形数独能够得到的最高分数。
输入格式
一共 99 行。每行 99 个整数每个数都在 0∼90∼9 的范围内表示一个尚未填满的数独方格未填的空格用“00”表示。每两个数字之间用一个空格隔开。
数的个数不少于 2424。
输出格式
输出共 11 行。输出可以得到的靶形数独的最高分数。如果这个数独无解则输出整数 −1。
样例输入
7 0 0 9 0 0 0 0 1
1 0 0 0 0 5 9 0 0
0 0 0 2 0 0 0 8 0
0 0 5 0 2 0 0 0 3
0 0 0 0 0 0 6 4 8
4 1 3 0 0 0 0 0 0
0 0 7 0 0 2 0 9 0
2 0 1 0 6 0 8 0 4
0 8 0 5 0 4 0 1 2
样例输出
2829
样例输入
0 0 0 7 0 2 4 5 3
9 0 0 0 0 8 0 0 0
7 4 0 0 0 5 0 1 0
1 9 5 0 8 0 0 0 0
0 7 0 0 0 0 0 2 5
0 3 0 5 7 9 1 0 8
0 0 0 6 0 1 0 0 0
0 6 0 9 0 0 0 0 1
0 0 0 0 0 0 0 0 6
样例输出
2852
说明/提示
数据规模与约定
对于 40% 的数据数独中非 00 数的个数不少于 3030对于 80% 的数据数独中非 00 数的个数不少于 2626对于 100% 的数据数独中非 00
参考代码
#include stdio.h
#include algorithm
#include stdlib.h
#include time.h
#define N 10
using namespace std;
int a[N][N],tot,ans,res,nxt;
int zer[N];
struct ptn
{int x,y;
}b[N * N];
int v[N][N] {{0,0,0,0,0,0,0,0,0,0},{0,6,6,6,6,6,6,6,6,6},{0,6,7,7,7,7,7,7,7,6},{0,6,7,8,8,8,8,8,7,6},{0,6,7,8,9,9,9,8,7,6},{0,6,7,8,9,10,9,8,7,6},{0,6,7,8,9,9,9,8,7,6},{0,6,7,8,8,8,8,8,7,6},{0,6,7,7,7,7,7,7,7,6},{0,6,6,6,6,6,6,6,6,6},
};
int bel[N][N] {{0,0,0,0,0,0,0,0,0,0},{0,1,1,1,2,2,2,3,3,3},{0,1,1,1,2,2,2,3,3,3},{0,1,1,1,2,2,2,3,3,3},{0,4,4,4,5,5,5,6,6,6},{0,4,4,4,5,5,5,6,6,6},{0,4,4,4,5,5,5,6,6,6},{0,7,7,7,8,8,8,9,9,9},{0,7,7,7,8,8,8,9,9,9},{0,7,7,7,8,8,8,9,9,9},
};
int cnt1[N][N];
int cnt2[N][N];
int cnt3[N][N];
inline bool cmp(ptn a,ptn b)
{return zer[a.x] zer[b.x];
}
inline void dfs(int q)
{if (q nxt){ans max(ans,res);if ((double)clock() / CLOCKS_PER_SEC 0.98){printf(%d,ans);exit(0);}return;}int xx b[q 1].x,yy b[q 1].y;for(int j 9;j 1;j--){a[xx][yy] j;if (cnt1[xx][j] || cnt2[yy][j] || cnt3[bel[xx][yy]][j]){continue;}cnt1[xx][a[xx][yy]] 1;cnt2[yy][a[xx][yy]] 1;cnt3[bel[xx][yy]][a[xx][yy]] 1;tot;res v[xx][yy] * j;dfs(q 1);tot--;res - v[xx][yy] * j;cnt1[xx][a[xx][yy]] 0;cnt2[yy][a[xx][yy]] 0;cnt3[bel[xx][yy]][a[xx][yy]] 0;a[xx][yy] 0;}
}
signed main()
{for (int i 1;i 9;i){for (int j 1;j 9;j){scanf(%d,a[i][j]);if (a[i][j]){tot,res v[i][j] * a[i][j];int xx i,yy j;cnt1[xx][a[xx][yy]] 1;cnt2[yy][a[xx][yy]] 1;cnt3[bel[xx][yy]][a[xx][yy]] 1;}if(!a[i][j])b[nxt] (ptn){i,j},zer[i];}}sort(b 1,b nxt 1,cmp);dfs(0);if (ans 0){puts(-1);}else{printf(%d,ans);}return 0;
}