POJ 2676 Sudoku
这题是个DFS搜索题。
大致题意:
九宫格问题,也有人叫数独问题
把一个9行9列的网格,再细分为9个3*3的子网格,要求每行、每列、每个子网格内都只能使用一次1~9中的一个数字,即每行、每列、每个子网格内都不允许出现相同的数字。
#include <stdio.h> #include <string.h> bool vish[9][10],visl[9][10],visg[9][10];\\行标记数组,列标记数组,方块标记数组 int map1[9][9],flat; void DFS (int x,int y) { int x1,y1,i; if(flat==1) { return; } if(map1[x][y]==0) { for(i=1; i<10; i++) { if(!vish[x][i]&&!visl[y][i]&&!visg[x/3*3+y/3][i]) { map1[x][y]=i; y1=y+1; x1=x; if(y1==9) { y1=0; x1++; } if(x1==9) { flat=1; return ; } vish[x][i]=1; visl[y][i]=1; visg[x/3*3+y/3][i]=1; DFS(x1,y1); if(flat) { return; } vish[x][i]=0; visl[y][i]=0; visg[x/3*3+y/3][i]=0; map1[x][y]=0; } } } else { y1=y+1; x1=x; if(y1==9) { y1=0; x1++; } if(x1==9) { flat=1; return ; } DFS(x1,y1); } return ; } int main() { int t,i,j,m; scanf("%d",&t); char s[12]; while(t--) { memset(vish,0,sizeof(vish)); memset(visl,0,sizeof(visl)); memset(visg,0,sizeof(visg)); for(i=0; i<9; i++) { scanf("%s",s); for(j=0; j<9; j++) { m=s[j]-'0'; if(m) { vish[i][m]=1; visl[j][m]=1; visg[i/3*3+j/3][m]=1; map1[i][j]=m; } else { map1[i][j]=0; } } } flat=0; DFS(0,0); for(i=0;i<9;i++) { for(j=0;j<9;j++) { printf("%d",map1[i][j]); } printf("\n"); } } return 0; }