数独:1到9,每一行每一列还有九个小的3X3方格中出现且仅出现一次
dfs的搜索,要注意判断条件,如何判断我没有想到,看了别人的做法才知道,还是太弱啊。
题不难,但是这是个有趣的问题,借助计算机和dfs,轻松成为数独高手。
#include<stdio.h>
#include<algorithm>
#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
char s[20][20];
int a[20][20],flag;
bool check_r_c(int r,int c,int num)
{
int i,j;
for(i=1;i<=9;i++)
{
if(a[r][i]==num)return 0;
}
for(j=1;j<=9;j++)
{
if(a[j][c]==num)return 0;
}
return 1;
}//判断行和列有无重复
int find(int r)
{
if(r>=1&&r<=3)return 1;
else if(r>=4&&r<=6)return 4;
else return 7;
}//找出在哪个小方格中
bool check_block(int r,int c,int num)
{
int x,y,i,j;
x=find(r);
y=find(c);
for(i=x;i<=x+2;i++)
{
for(j=y;j<=y+2;j++)
{
if(a[i][j]==num)return 0;
}
}
return 1;
}//判断小方格有无重复的
void dfs(int r,int c)
{
int i,j;
if(flag)return;
if(r>9)//搜完了,输出
{
flag=1;
for(i=1;i<=9;i++)
{
for(j=1;j<=9;j++)
{
printf("%d",a[i][j]);
}
printf("\n");
}
return;
}
//cout<<r<<" "<<c<<endl;
if(a[r][c]==0)//没有填
{
for(i=1;i<=9;i++)
{
if(check_r_c(r,c,i)&&check_block(r,c,i))
{
a[r][c]=i;
if(c==9)
{
dfs(r+1,1);//下一行
}
else dfs(r,c+1);
}
}
a[r][c]=0;//回溯,重新置为0
}
else//已经填了
{
if(c==9)dfs(r+1,1);
else dfs(r,c+1);
}
}
int main()
{
int T,i,t,j;
scanf("%d",&T);
while(T--)
{
for(i=1;i<=9;i++)
scanf("%s",s[i]+1);//从s[i]+1开始输入
for(i=1;i<=9;i++)
{
for(j=1;j<=9;j++)
{
if(s[i][j]>='1'&&s[i][j]<='9')
a[i][j]=s[i][j]-'0';
else a[i][j]=0;
}
}
flag=0;
dfs(1,1);
printf("\n");
}
return 0;
}