标签:
Time Limit: 2000MS | Memory Limit: 65536KB | 64bit IO Format: %I64d & %I64u |
Description
Input
Output
Sample Input
1 103000509 002109400 000704000 300502006 060000050 700803004 000401000 009205800 804000107
Sample Output
143628579 572139468 986754231 391542786 468917352 725863914 237481695 619275843854396127
用三个数组分别记录每行、列、格子出现过的数字,然后进行dfs即可
代码:
#include<cstdio> #include<iostream> #include<cstring> #include<algorithm> #include<vector> #include<cmath> #include<cstdlib> #define mem(a,b) memset(a,b,sizeof(a)) using namespace std; const int maxd=10+5; typedef long long ll; int dx[]= {0,0,1,-1}; int dy[]= {1,-1,0,0}; //==================== int mz[maxd][maxd],visr[maxd][maxd],visc[maxd][maxd],grid[maxd][maxd]; char m[maxd][maxd]; void init() { mem(visr,0),mem(visc,0),mem(grid,0); for(int i=0; i<9; ++i) { scanf("%s",m[i]); for(int j=0; j<9; ++j) { mz[i][j]=m[i][j]-'0'; visr[i][mz[i][j]]=1; visc[j][mz[i][j]]=1; int tmp=i/3*3+j/3; grid[tmp][mz[i][j]]=1; } } } bool dfs(int x,int y) { // if(!setnum(x,y)) return; if(x==9) return true; bool flag=false; if(mz[x][y]==0) { int tmp=x/3*3+y/3; for(int i=1; i<=9; ++i) if(visr[x][i]==0 && visc[y][i]==0 && grid[tmp][i]==0) { mz[x][y]=i; visr[x][i]=1; visc[y][i]=1; grid[tmp][i]=1; if(y==8) flag=dfs(x+1,0); else flag=dfs(x,y+1); if(flag) return true; else { mz[x][y]=0; visr[x][i]=0; visc[y][i]=0; grid[tmp][i]=0; } } } else { if(y==8) flag=dfs(x+1,0); else flag=dfs(x,y+1); if(flag) return true; else return false; } return false; } void print(int k) { printf("Scenario #%d:\n",k); for(int i=0; i<9; ++i) { for(int j=0; j<9; ++j) printf("%d",mz[i][j]); printf("\n"); } printf("\n"); } int main() { freopen("1.txt","r",stdin); int kase; scanf("%d",&kase); for(int k=1;k<=kase;++k) { init(); dfs(0,0); print(k); } return 0; }
标签:
原文地址:http://blog.csdn.net/whoisvip/article/details/45726513