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
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<