题目:http://poj.org/problem?id=2918
和poj-2676一样的思路:https://blog.csdn.net/liwei_av/article/details/82025797
#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,count=0;
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);
printf("Scenario #%d:\n",++count);
for(int i=0;i<9;i++)
{
for(int j=0;j<9;j++) printf("%d",map[i][j]);
printf("\n");
}
printf("\n");
}
return 0;
}