题目:http://poj.org/problem?id=2676
思路:dfs+剪枝
//之前样例测试组数我放在循环里面了导致一直wa
//简单搜索判断合格条件就行了
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
int map[10][10],flag;
bool judge(int x,int i,int j)
{
for(int h=0;h<9;h++)//判断该位置的i行j列是否会出现重复的元素
{
if(map[i][h]==x) return 0;
if(map[h][j]==x) return 0;
}
int xx=i-i%3;//判断每个3乘3的子矩阵是否会出现重复的元素
int yy=j-j%3;
for(int m=xx;m<xx+3;m++)
for(int n=yy;n<yy+3;n++)
if(map[m][n]==x) return 0;
return 1;
}
void dfs(int x,int y)
{
if(x==9)
{
flag=1;
return ;
}
if(y==9) dfs(x+1,0);
else
{
if(map[x][y]) dfs(x,y+1);
else
{
for(int i=1;i<=9;i++)
if(judge(i,x,y))
{
map[x][y]=i;
dfs(x,y+1);
if(flag==1) return ;
map[x][y]=0;
}
}
}
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
char s[9];
for(int i=0;i<9;i++)
{
scanf("%s",s);
for(int j=0;j<9;j++) map[i][j]=s[j]-'0';
}
flag=0;
dfs(0,0);
for(int i=0;i<9;i++)
{
for(int j=0;j<9;j++) printf("%d",map[i][j]);
printf("\n");
}
}
return 0;
}