#include<iostream>
using namespace std;
#include<string>
int row[10][10]; //记录某行 数k是否被使用
int col[10][10]; //记录某列 数k是否被使用
int sq[10][10]; //记录某格 数k是否被使用 1-9
char gg[15][15];
bool ok;
void dfs(int i,int j)
{
if(ok==1) //找到答案后停止所有搜索
return;
if(i==10) // 找到答案,输出数独
{
ok=1;
for(int p=1;p<=9;p++)
{
for(int q=1;q<=9;q++)
{
printf("%c",gg[p][q]);
}
printf("\n");
}
return ;
}
if(gg[i][j]>='1' && gg[i][j]<='9') //当前不可写,直接 dfs(next)
{
if(j==9)
dfs(i+1,1);
else dfs(i,j+1);
return;
}
for(int k=1;k<=9;k++)
{
if(!row[i][k] && !col[j][k] && !sq[((i-1)/3)*3+(((j-1)/3)+1)][k])
{
gg[i][j]='0'+k;
row[i][k]++;
col[j][k]++;
sq[((i-1)/3)*3+(((j-1)/3)+1)][k]++; //dfs 填写结果
if(j==9)
dfs(i+1,1);
else dfs(i,j+1);
gg[i][j]='.';
row[i][k]=0;
col[j][k]=0;
sq[((i-1)/3)*3+(((j-1)/3)+1)][k]=0; //注意还原,如果当前dfs不通,方便执行下个dfs
}
}
}
int main()
{
for(int i=1;i<=9;i++)
for(int j=1;j<=9;j++)
{
cin>>gg[i][j];
if(gg[i][j]!='.')
{
row[i][gg[i][j]-'0']++;
col[j][gg[i][j]-'0']++;
sq[((i-1)/3)*3+(((j-1)/3)+1)][gg[i][j]-'0']++;
}
}
dfs(1,1);
return 0;
}
数独dfs
おすすめ
転載: blog.csdn.net/weixin_45448563/article/details/113568946
おすすめ
ランキング