#include"iostream"
#include"cstdio"
#include"cstdlib"
using namespace std;
typedef struct node
{
int x,y;
}pairk;
class alonemath
{
public:
alonemath()
{
memset(map,0,sizeof(map));
memset(bookmath,0,sizeof(bookmath));
}
friend istream& operator>>(istream&,alonemath&);
friend ostream& operator<<(ostream&,alonemath&);
pairk find();
void dfs(pairk);
private:
int map[10][10];
int bookmath[10][10];
};
istream& operator>>(istream& in,alonemath& x)
{
cout<<"输入你的数独方阵"<<endl;
for(int i=1;i<=9;i++)
{
for(int j=1;j<=9;j++)
{
cin>>x.map[i][j];
if(x.map[i][j]!=0) x.bookmath[i][j]=1;
}
}
cout<<endl<<endl;
return in;
}
ostream& operator<<(ostream& out,alonemath& x)
{
for(int i=1;i<=9;i++)
{
for(int j=1;j<=9;j++)
{
cout<<x.map[i][j]<<' ';
}
cout<<endl;
}
cout<<"数独输出完毕"<<endl;
return out;
}
pairk alonemath::find()
{
for(int i=1;i<=9;i++)
{
for(int j=1;j<=9;j++)
{
if(bookmath[i][j]==0)
{
pairk k;
k.x=i;
k.y=j;
return k;
}
}
}
pairk k;
k.x=0;
k.y=0;
return k;
}
void alonemath::dfs(pairk k)
{
if(k.x==k.y&&k.x==0)
{
cout<<*this;
exit(0);
}
int dx,dy;
if(k.x%3==0) dx=(k.x/3)*3-3;
else dx=(k.x/3)*3;
if(k.y%3==0) dy=(k.y/3)*3-3;
else dy=(k.y/3)*3;
int book[10];
memset(book,0,sizeof(book));
for(int a=1;a<=9;a++)
{
if(map[k.x][a]!=0) book[map[k.x][a]]=1;
if(map[a][k.y]!=0) book[map[a][k.y]]=1;
}
for(int b=1;b<=3;b++)
{
for(int c=1;c<=3;c++)
if(map[dx+b][dy+c]!=0) book[map[dx+b][dy+c]]=1;
}
for(int d=1;d<=9;d++)
{
if(book[d]==0)
{
pairk w;
bookmath[k.x][k.y]=1;
map[k.x][k.y]=d;
w=find();
dfs(w);
bookmath[k.x][k.y]=0;map[k.x][k.y]=0;
}
}
}
int main()
{
alonemath my;
cin>>my;
pairk w;
w=my.find();
my.dfs(w);
getchar();
return 0;
}
数独破解器
最新推荐文章于 2021-06-10 16:03:18 发布