题意:数独
注意:小方格内的数判断,先将整个数组按照3*3的方格划分成9个区域。
1 | 2 | 3 |
4 | 5 | 6 |
7 | 8 | 9 |
View Code
#include <iostream> using namespace std; int map[12][12]; int used[12][12];//判断9个格子中是否存在要填得数 int used1[12][12];//判断这一行中是否存在要填的数 int used2[12][12];//判断这一列中是否存在要填的数 char ch; int sum; int temp=0; int flag; struct node { int i,j; }step[90]; int panduan(int a,int b,int n) { if(used1[a][n]||used2[b][n])//判断行列是否存在该数 { return 0; } int x=(a-1)/3; if(used[x*3+(b-1)/3+1][n])//判断小方格里面是否可以放该数 { return 0; } return 1; } void dfs(int k) { if(flag) { return ; } if(k==sum+1) { for(int i=1;i<=9;i++) { for(int j=1;j<=9;j++) { if(j==1) { printf("%d",map[i][j]); } else printf(" %d",map[i][j]); } printf("\n"); } flag=1; return; } else { for(int i=1;i<=9;i++) { if(panduan(step[k].i,step[k].j,i))//判断是否可以放 { map[step[k].i][step[k].j]=i; used[(step[k].i-1)/3*3+(step[k].j-1)/3+1][i]=1; used1[step[k].i][i]=1; used2[step[k].j][i]=1;//各种标记 dfs(k+1); if(flag) { return; } map[step[k].i][step[k].j]=0; used[(step[k].i-1)/3*3+(step[k].j-1)/3+1][i]=0; used1[step[k].i][i]=0; used2[step[k].j][i]=0; } } } return; } int main() { while(cin>>ch) { sum=0; if(ch>='1'&&ch<='9')//处理第一个数 { map[1][1]=ch-'0'; used[1][map[1][1]]=1; used1[1][map[1][1]]=1; } else { ++sum; map[1][1]=0; step[sum].i=1; step[sum].j=1; } for(int i=1;i<=9;i++) { for(int j=1;j<=9;j++) { if(i==1&&j==1) { continue; } cin>>ch; if(ch>='1'&&ch<='9') { map[i][j]=ch-'0'; used1[i][map[i][j]]=1;//判断行 int x=(i-1)/3;//将9*9的矩阵分区 used[x*3+(j-1)/3+1][map[i][j]]=1;// } else { ++sum; map[i][j]=0; step[sum].i=i; step[sum].j=j; } } } for(i=1;i<=9;i++)//判断列 { for(int j=1;j<=9;j++) { if(map[i][j]) { used2[j][map[i][j]]=1; } } } if(temp++) { printf("\n"); } flag=0; dfs(1); memset(map,0,sizeof(map)); memset(step,0,sizeof(step)); memset(used,0,sizeof(used)); memset(used1,0,sizeof(used1)); memset(used2,0,sizeof(used2)); } return 0; }