其实算法很简单,就是穷举加剪枝。
从(0,0)开始推演,当一个格子占据一种状态后将与之关联的系统中的一种状态删去,每个格点只能在剩下的状态中选取值。但这种算法有点慢且我们永远都等不到程序运行完,而且想把所有解都储存下来至少个人电脑是不可能的。就当好玩吧。
另外把文件指针放在外部打开可以提高程序运行速度。
#include<bits/stdc++.h>
using namespace std;
FILE *fp=fopen("jiugongkiller.txt","a");
int heng[9][9]={0},shu[9][9]={0},fang[9][9]={0},mx[9][9]={0},ct=0;
int wf(int x,int y)
{
if(x>=0&&x<=2)
{
if(y>=0&&y<=2)
return(0);
if(y>=3&&y<=5)
return(1);
if(y>=6&&y<=8)
return(2);
}
if(x>=3&&x<=5)
{
if(y>=0&&y<=2)
return(3);
if(y>=3&&y<=5)
return(4);
if(y>=6&&y<=8)
return(5);
}
if(x>=6&&x<=8)
{
if(y>=0&&y<=2)
return(6);
if(y>=3&&y<=5)
return(7);
if(y>=6&&y<=8)
return(8);
}
}
void print()
{
ct++;
fprintf(fp,"\n");
for(int x=0;x<9;x++)
{
for(int y=0;y<9;y++)
{
fprintf(fp,"%d ",mx[x][y]);
}
fprintf(fp,"\n");
}
fprintf(fp,"\n");
}
void killer(int x,int y)
{
for(int a=0;a<9;a++)
{
if(fang[wf(x,y)][a]==0&&heng[x][a]==0&&shu[y][a]==0)
{
fang[wf(x,y)][a]=heng[x][a]=shu[y][a]=1;
mx[x][y]=a+1;
if(x==8&&y==8)
{
print();
}
else if(y==8)
{
killer(x+1,0);
}
else
{
killer(x,y+1);
}
fang[wf(x,y)][a]=heng[x][a]=shu[y][a]=0;
}
}
}
int main(void)
{
killer(0,0);
fprintf(fp,"%d",ct);
}