题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=5547
数独,保证每一行每一列都有1,2,3,4
还有4 个2 * 2的小方块儿里也必须是1,2,3,4
输入:
3 **** 2341 4123 3214 *243 *312 *421 *134 *41* **3* 2*41 4*2*
输出:
Case #1:
1432 2341 4123 3214 Case #2: 1243 4312 3421 2134 Case #3: 3412 1234 2341 4123
#include<stdio.h> #include<string.h> using namespace std; char a[100][100]; int panduan(int row,int col) { for(int i=0;i<4;i++) { if(a[row][i]==a[row][col]&&i!=col) return 0; } ///判断该数字是否可以存在这一行里 for(int i=0;i<4;i++) { if(a[i][col]==a[row][col]&&i!=row) return 0; } ///判断该数字是否可以存在这一列里 int mrow=row; int mcol=col; if(row%2==1)row-=1; if(col%2==1)col-=1; for(int i=row;i<=row+1;i++) { for(int j=col;j<=col+1;j++) { { if(a[i][j]==a[mrow][mcol]&&i!=mrow&&j!=mcol)return 0; } } } ///判断2*2的小方框里是不是1,2,3,4 return 1; } void dfs(int cur) { if(cur==4*4)///如果到达最后一个点则输出全部 { for(int i=0;i<4;i++) { for(int j=0;j<4;j++) { printf("%c",a[i][j]); } printf(" "); } return ; } int row=cur/4;///行 int col=cur%4; ///列 if(a[row][col]=='*') { for(int j=1;j<=4;j++) ///吧1,2,3,4每个数都试一遍 { a[row][col]=j+'0'; if(panduan(row,col)==1) ///符合条件则进入下一个点 { dfs(cur+1); } a[row][col]='*'; ///取消标记 } } else { dfs(cur+1); } } int main() { int kase=0; int t; scanf("%d",&t); while(t--) { for(int i=0;i<4;i++) { scanf("%s",a[i]); } printf("Case #%d: ",++kase); dfs(0); } return 0; }