- 问题描述
-
数独是非常流行的益智游戏,把一个9x9的九宫格分成9个小的3x3的小九宫,如下图所示。在这个九宫格上,每个小格子可以填的数字为1,2,3,...,9。初始时,某些格子已经填好数字,剩余的一些则为空白,你的任务是把空白的数字都填上1,2,3,...,9数字的一个,使得表格上每一行、每一列、以及每一个小九宫均含有有1,2,3,...,9(显然每个数字在每行、每列和每个小九宫中都出现并且只能出现一次)。请你写一个程序解决数独问题。
- 输入
-
输入为9行,每行9个数字,其中0代表对应的小格子为空白的格子。 - 输出
-
输出为9行,每行9个有1,2,3,...,9构成的数字。即数独问题的解。 - 输入样列
-
103000509 002109400 000704000 300502006 060000050 700803004 000401000 009205800 804000107
- 输出样例
-
143628579 572139468 986754231 391542786 468917352 725863914 237481695 619275843 854396127说一下思路吧,我是参考黄学长的~就是将每一行每一列每一个九宫格标记一下,然后dfs搜索,注意边界和搜索完要保持原先的状态即可~
#include<bits/stdc++.h> #define Next(x,y) y==9 ? dfs(x+1,1) : dfs(x,y+1) using namespace std; int a[10][10],b[10][10]; bool l[10][10],r[10][10],s[10][10]; int Map[10][10]; int fill(int x,int y,int k) { if(l[x][k]||r[y][k]||s[Map[x][y]][k]) return 0; b[x][y]=k; l[x][k]=r[y][k]=s[Map[x][y]][k]=1; return 1; } void del(int x,int y,int k) { b[x][y]=0; l[x][k]=r[y][k]=s[Map[x][y]][k]=0; } void print() { for(int i=1;i<=9;i++){ for(int j=1;j<=9;j++) cout<<b[i][j]<<""; cout<<"\n";} } void dfs(int x,int y) { if(x==10&&y==1) { print();exit(0); } if(b[x][y]) Next(x,y); else { for(int i=1;i<=9;i++) { if(fill(x,y,i)) { Next(x,y); del(x,y,i);//搜过之后要删除 } } } } void init() { for(int i=1;i<=9;i++) for(int j=1;j<=9;j++) Map[i][j]=(i-1)/3*3+(j-1)/3+1; } int main() { char str; init(); /*for(int i=1;i<=9;i++){ for(int j=1;j<=9;j++) cout<<Map[i][j]<<" "; cout<<"\n";}*/ for(int i=1;i<=9;i++) { for(int j=1;j<=9;j++) { str=getchar(); a[i][j]=str-‘0‘; if(a[i][j]) fill(i,j,a[i][j]); } getchar(); } dfs(1,1); /*for(int i=1;i<=9;i++){ for(int j=1;j<=9;j++) cout<<s[i][j]<<" "; cout<<"\n";}*/ }
时间: 2024-10-18 09:10:42