招聘专利代理人:如何用构造法解决n皇后问题?

来源:百度文库 编辑:高校问答 时间:2024/05/05 06:20:25
8皇后问题可以用搜索来做,但当皇后多时很慢,应该还有个启发式修补,但听说可以用构造法的,是否有人知道?
你的这个c语言的程序用的是回溯法(接近深搜)吧?
我想问可否有构造法的,就是直接生成满足答案的姐,不需一个一个地试

非递归的8皇后问题

/******************
本程序已经在 TC2.0 中运行通过。
******************/

int x[9]={0};
int n=1;
int chk(int a, int b) /*检测(x,y)处的皇后是否与已有皇后冲突,同行、同斜线均为冲突。*/
{
int i;
if(a != 0)
{
for(i=1; i <= a; i++)
{
if((b == x[i]) || (a - i == b - x[i]) || (a - i == x[i] - b))
{
return 0; /*代表有冲突*/
}
}
}

return 1; /*没有冲突*/
}

void output()
{
int i,j;
for(i=1;i<=8;i++)
for(j=1;j<=8;j++)
{gotoxy(j+1,i); printf(".");}
for(i=1;i<=8;i++)
{gotoxy(i+1,x[i]); printf("o");}
gotoxy(20,10);
printf("view the %d font now!\n",n++);
getch();
}

void main()
{
int i,j,bool;
for(i=1;i<=8;i++)
{
bool=0;
for(j=x[i]+1;j<=8;j++)
{
bool=chk(i,j);
if(bool==1)
{
x[i]=j; break;
}
}
if(j==9 && bool==0) {x[i]=0; i=i-2;}
if(i==8 && bool==1) {output(); x[i]=0; i=i-2;}
if(i==-1) {break;}
}
}

/*
if((b == x[i]) || (a - i == b - x[i]) || (a - i == x[i] - b))
这句话是判断是否冲突的函数的主体,a 代表 x 轴,b 代表 y 轴,数组 x[i] 则是记录第 x=i 列
的哪一个位置放有皇后,然后把现在的a , b 和前面的已经放置的皇后比较一下,看一下是否有 b == x[i] 同行,a - i == b - x[i] 同斜线,a - i == x[i] - b 另一条斜线,冲突的发生。相信大家都能明白这个 chk 函数的原理,output 函数则更简单了,没必要解释了吧*_*

main 函数里面的循环也不难,主要就是模拟了一下回溯而已,有一点需要注意,就是在
for(i=1;i<=8;i++) 后面的那一句 bool=0; 我就是因为一开始少了这一句,只能出来16个解,

高手。
本人不是专学计算机语言的。呵