说实话,有了这个程序,我就能通杀那个数独网了。真方便!
#include<iostream>
using namespace std;
int a[9][9];
int Line[9],Row[9],S[3][3];
bool Flag;
void Set(int x,int y,int n)
{
int t=1<<n;
Line[x]|=t;
Row[y]|=t;
S[x/3][y/3]|=t;
}
bool Check(int x,int n)
{
int t=1<<n;
if (x&t) return 0;
else return 1;
}
void Return(int x,int y,int n)
{
int t=~(1<<n);
Line[x]&=t;
Row[y]&=t;
S[x/3][y/3]&=t;
}
void Print()
{
for (int i=0;i<9;i++)
{
for (int j=0;j<8;j++) cout<<a[i][j]<<" ";
cout<<a[i][8]<<endl;
}
}
void Search(int x,int y)
{
if (x==9)
{
Print(); Flag=1; return;
}
if (y==9)
{
Search(x+1,0);
return;
}
if (a[x][y])
{
Search(x,y+1);
return;
}
for (int i=1;i<=9;i++)
{
if (Check(Line[x],i)&&Check(Row[y],i)&&Check(S[x/3][y/3],i))
{
a[x][y]=i;
Set(x,y,i);
Search(x,y+1);
if (Flag) return;
a[x][y]=0;
Return(x,y,i);
}
}
}
int main()
{
for (int i=0;i<9;i++)
for (int j=0;j<9;j++)
{
cin>>a[i][j];
if (a[i][j]) Set(i,j,a[i][j]);
}
Search(0,0);
return 0;
}
哈哈!