N皇后问题
源代码在线查看: nhuanghou ok.cpp
软件大小: |
12 K |
上传用户: |
cocoplus |
|
|
关键词: |
|
下载地址: |
免注册下载 普通下载
|
|
#include
//#include
#define MAXQ 100
int N, t;
int qx[MAXQ], qy[MAXQ];
int cure;
//char c;
int cheak(int x, int y) //检测(x,y)处的皇后是否与已有皇后冲突,同列、同斜线均为冲突。
{
if(y != 0)
{
for(int i=0; i < cure; i++)
{
if((qx[i] == x) || (x - qx[i] == y - qy[i]) || (x - qx[i] == qy[i] - y))
return 0;
}
}
return 1;
}
void Queen(void)
{
int allfail; //static int allfail;
cure=0; //已经放置的皇后数
t=0; //解的个数
for(int i=0; i < N; i++) //开始时,所有皇后全部不在棋盘上。
qx[i]= -1;
while( cure>= 0) //求出所有解,直到无法放置。
{
allfail=1; //如果皇后不是在棋盘外(-1),说明本次是回溯回来的。
if(qx[cure] < N - 1) //如果皇后已经处在最后一列,说明本皇后已经无法放置,这时再次回溯。
{ //从上一次的皇后位置的下一位置开始寻找不冲突的位置。
for(int i=qx[cure] + 1; i < N; i++)
{
if(cheak(i, cure)) //如果不冲突,放置一个皇后
{
qx[cure]=i;
qy[cure]=cure;
cure++;
allfail=0;
break;
}
}
}
if(allfail) //如果从上一次的皇后位置的下一位置开始全部冲突,则回溯。
{
qx[cure]= -1; //将本皇后拿出棋盘。
cure--;
}
if(cure == N) //如果皇后数达到棋盘行(列)数,说明所有皇后都不冲突,输出解。
{
++t;
for(int i=0; i < N; i++)
{
if(i%N==0)
printf("\n第%d种摆法:\n",t);
for(int j=0; j < N; j++)
{
if(qx[i] == j)
printf("Q ");
else
printf("* ");
}
printf("\n");
}
/* if(t%10==0)
{
printf("是否继续?(y/n):");
scanf("%c",&c);
if(c!='y') ;
exit(1);
}*/
qx[cure]= -1;
cure--;
}
}
}
void main()
{ printf("Please input the number of the Queens:\nN=");
scanf("%d",&N);
if(N > MAXQ)
printf("Too big, N must less than 100.\n");
Queen();
printf("--------------------------------\n");
printf("*********一共有%d种摆法*********\n", t);
printf("--------------------------------\n");
}