题目链接:http://poj.org/problem?id=2676
#include<iostream> #include<string> #include<cstdio> #include<cstring> #include<queue> #include<map> #include<stack> #include<set> #include<vector> #include<algorithm> #define LL long long using namespace std; struct node { int r,c; }point[85]; int cnt,flag=0; int a[10][10]; int row[10][10],col[10][10],block[3][3][10]; bool isok(int r,int c,int num) // 判断是否可以放num数字; { return (!row[r][num]&&!col[c][num]&&!block[r/3][c/3][num]); } void flagall(int r,int c,int num,int f) // 给行列,宫格标记 { row[r][num]=f; col[c][num]=f; block[r/3][c/3][num]=f; } void dfs(int n) { int r=point[n].r,c=point[n].c; if(flag) return; if(n==cnt){ for(int i=0;i<9;i++){ for(int j=0;j<9;j++){ printf("%d",a[i][j]); } printf("\n"); } flag=1; return; }else{ for(int i=1;i<=9;i++){ if(isok(r,c,i)){ a[r][c]=i; flagall(r,c,i,1); // 标记为1; dfs(n+1); a[r][c]=0; flagall(r,c,i,0); // 标记为0; } } } return ; } int main() { int t; char str[15]; scanf("%d",&t); while(t--){ cnt=0,flag=0; memset(row,0,sizeof(row)); memset(col,0,sizeof(col)); memset(block,0,sizeof(block)); for(int i=0;i<9;i++){ scanf("%s",&str); // 字符串,一个一个分开处理; for(int j=0;j<strlen(str);j++){ a[i][j]=str[j]-'0'; if(!a[i][j]) point[cnt].r=i,point[cnt++].c=j; else{ flagall(i,j,a[i][j],1); } } } dfs(0); } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/wlxsq/article/details/46983995