Time Limit: 2000MS | Memory Limit: 65536K | |||
Total Submissions: 9679 | Accepted: 4791 | Special Judge |
Description
Input
Output
Sample Input
1 103000509 002109400 000704000 300502006 060000050 700803004 000401000 009205800 804000107
Sample Output
143628579 572139468 986754231 391542786 468917352 725863914 237481695 619275843 854396127
#include <iostream> using namespace std; int map[10][10],count1; bool row[10][10],coloumn[10][10],cr[10][10];//用来标记行,竖,小方格 struct p { int x,y; }point[100];//标记每个格子的横纵坐标 int cxbfine(int i,int j)//规定每个3*3方格的号码 { return ((i-1)/3)*3+(j-1)/3; } int dfs(int n)//进行深搜,符合条件往下,填不下就回溯 { if(n>count1) return 1; for(int i=1;i<=9;i++) if(!row[point[n].x][i] && !coloumn[point[n].y][i] && !cr[cxbfine(point[n].x,point[n].y)][i]) { row[point[n].x][i]=true; coloumn[point[n].y][i]=true; cr[cxbfine(point[n].x,point[n].y)][i]=true; map[point[n].x][point[n].y]=i; if(dfs(n+1)) return 1; row[point[n].x][i]=false; coloumn[point[n].y][i]=false; cr[cxbfine(point[n].x,point[n].y)][i]=false; } return 0; } int main() { int n,i,j; cin>>n; while(n--) { count1=0; memset(row,false,sizeof(row)); memset(coloumn,false,sizeof(coloumn)); memset(cr,false,sizeof(cr)); for(i=1;i<=9;i++)//输入并判断 for(j=1;j<=9;j++) { scanf("%1d",&map[i][j]); if(map[i][j]) { row[i][map[i][j]]=true; coloumn[j][map[i][j]]=true; cr[cxbfine(i,j)][map[i][j]]=true; } else { count1++; point[count1].x=i; point[count1].y=j; } } dfs(1); for(i=1;i<=9;i++) { for(j=1;j<=9;j++) cout<<map[i][j]; cout<<endl; } } return 0; }