题目描述
数独是根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行、每一列、每一个粗线宫内的数字均含1-9,不重复。每一道合格的数独谜题都有且仅有唯一答案,推理方法也以此为基础,任何无解或多解的题目都是不合格的。
芬兰一位数学家号称设计出全球最难的“数独游戏”,并刊登在报纸上,让大家去挑战。
这位数学家说,他相信只有“智慧最顶尖”的人才有可能破解这个“数独之谜”。
据介绍,目前数独游戏的难度的等级有一道五级,一是入门等级,五则比较难。不过这位数学家说,他所设计的数独游戏难度等级是十一,可以说是所以数独游戏中,难度最高的等级他还表示,他目前还没遇到解不出来的数独游戏,因此他认为“最具挑战性”的数独游戏并没有出现。
输入输出格式
输入格式:
一个未填的数独
输出格式:
填好的数独
输入输出样例
输入样例#1:
8 0 0 0 0 0 0 0 0 0 0 3 6 0 0 0 0 0 0 7 0 0 9 0 2 0 0 0 5 0 0 0 7 0 0 0 0 0 0 0 4 5 7 0 0 0 0 0 1 0 0 0 3 0 0 0 1 0 0 0 0 6 8 0 0 8 5 0 0 0 1 0 0 9 0 0 0 0 4 0 0
输出样例#1:
8 1 2 7 5 3 6 4 9 9 4 3 6 8 2 1 7 5 6 7 5 4 9 1 2 8 3 1 5 4 2 3 7 8 9 6 3 6 9 8 4 5 7 2 1 2 8 7 1 6 9 5 3 4 5 2 1 9 7 4 3 6 8 4 3 8 5 2 6 9 1 7 7 9 6 3 1 8 4 5 2
说明
你猜,你猜,你猜猜猜
猜不出来吧,我不告诉你~~~
思路见代码解析
代码:
1 #include<iostream> 2 #include<cstdio> 3 using namespace std; 4 const int group[9][9]= 5 { 6 0,0,0,1,1,1,2,2,2, 7 0,0,0,1,1,1,2,2,2, 8 0,0,0,1,1,1,2,2,2, 9 3,3,3,4,4,4,5,5,5, 10 3,3,3,4,4,4,5,5,5, 11 3,3,3,4,4,4,5,5,5, 12 6,6,6,7,7,7,8,8,8, 13 6,6,6,7,7,7,8,8,8, 14 6,6,6,7,7,7,8,8,8 15 }; 16 int a[10][10]; 17 bool row[10][10],col[10][10],gr[10][10];//判断行,列,3*3正方形上有无重复数字 18 void dfs(int x,int y) 19 { 20 if(x==9)//满足退出条件 输出答案 21 { 22 for(int i=0;i<9;i++) 23 { 24 for(int j=0;j<9;j++) 25 cout<<a[i][j]+1<<" "; 26 cout<<endl; 27 } 28 return; 29 } 30 int next_x=x,next_y=y+1; 31 if(next_y==9)next_x=x+1,next_y=0; 32 if(a[x][y]>=0)dfs(next_x,next_y);//若原来有数字,直接跳过 33 else//原来没有数字则枚举所有可能性 并判断有无标记 34 { 35 for(int i=0;i<9;i++) 36 if(!row[x][i] && !col[y][i] && !gr[group[x][y]][i]) 37 { 38 row[x][i]=col[y][i]=gr[group[x][y]][i]=1;//对应标记 39 a[x][y]=i; 40 dfs(next_x,next_y);//搜索下一状态 41 a[x][y]=-1;//回溯 42 row[x][i]=col[y][i]=gr[group[x][y]][i]=0; 43 } 44 } 45 } 46 int main() 47 { 48 for(int i=0;i<9;i++) 49 for(int j=0;j<9;j++) 50 cin>>a[i][j],a[i][j]--; 51 for(int i=0;i<9;i++) 52 for(int j=0;j<9;j++) 53 if(a[i][j]>=0)//不为空,则标记对应的位置 54 { 55 row[i][a[i][j]]=1; 56 col[j][a[i][j]]=1; 57 gr[group[i][j]][a[i][j]]=1; 58 } 59 dfs(0,0); 60 return 0; 61 }
时间: 2024-10-09 02:45:09