análisis
Utilice la entrada de cadena para
convertirlo en un valor numérico en la matriz una
matriz lll Estadísticas del uso de la
matriz denúmeros de fila actualrrr Estadísticas del uso de los números de columna actuales
ArrayfffEstadísticas del uso actual de 3 * 3 números de cuadrícula
Enumere los números que se pueden completar en la cuadrícula actual
Subir código
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int a[10][10],l[10][10],r[10][10],f[10][10][10],p;
string s;
int find(int x)
{
if(x<4) return 1;
if(x<7) return 2;
return 3;
}
void dfs(int x,int y)
{
if(p) return;//已经有答案了
if(x>9)
{
for(int i=1;i<=9;i++)
{
for(int j=1;j<=9;j++)
{
cout<<a[i][j];
}
}
cout<<endl;
p=1;
return;
}
if(a[x][y])
{
if(y==9) dfs(x+1,1);
else dfs(x,y+1);
}
for(int i=1;i<=9;i++)
{
if(!l[x][i]&&!r[y][i]&&!f[find(x)][find(y)][i]&&!a[x][y])
{
a[x][y]=i;
l[x][i]=r[y][i]=f[find(x)][find(y)][i]=1;
if(y==9) dfs(x+1,1);
else dfs(x,y+1);
a[x][y]=0;
l[x][i]=r[y][i]=f[find(x)][find(y)][i]=0;//回溯
}
}
}
int main()
{
while(cin>>s)
{
if(s=="end") return 0;
p=0;
memset(l,0,sizeof(l));
memset(r,0,sizeof(r));
memset(f,0,sizeof(f));
for(int i=1;i<=9;i++)
{
for(int j=1;j<=9;j++)
{
if(s[(i-1)*9+j-1]!='.')
{
a[i][j]=s[(i-1)*9+j-1]-48;
l[i][a[i][j]]=1;
r[j][a[i][j]]=1;
f[find(i)][find(j)][a[i][j]]=1;
}
else a[i][j]=0;
}
}
dfs(1,1);
}
return 0;
}