问题描述
在n*n的棋盘上放置n个皇后,要求每个皇后不同行不同列,不同左右对角线
问题求解
采用整数数组q[n]存放n皇后问题的的求解结果,因为每行只能放一个皇后,q[i](1<=i<=n)的值表示第i个皇后所在的列号,即该皇后放在(i,q[i])的位置上。
代码
#include<stdio.h>
#include<stdlib.h>
#define N 20 //最多皇后个数
int q[N]; //存放个皇后所在的列号,即(i,q[i])为一个皇后的位置
int count = 0; //累计解个数
void dispasolution (int n)//输出N皇后问题的一个解
{
printf(" 第%d个解:",++count);
for(int i=1;i<=n;i++)
printf("(%d,%d)",i,q[i]);
printf("/n")
}
bool place(int i,int j) //测试(i,j)位置能否摆放皇后
{
if(i==1) return true; //第一个皇后总是可以放置
int k=1;
while(k<i) //k=1~i-1是已经放置了皇后的行
{
if((q[k]==j)||(abs(q[k]-j))==(abs(i-k)))
return false;
k++;
}
return true;
}
void queen(int i,int n){ //放置1~n的皇后
if(i>n)
dispasolution(n); //所有n皇后放置结束
else
{
for(int j=1;j<=n;j++) //在第i行上试探每一个列j
{
if(place(i,j)) //在第i行上找一个合适位置
{
q[i]=j;
queen(i+1,n);
}
}
}
}
void main(){
int n; //实际存放皇后个数
printf("n皇后的问题(n<20)n=");
scanf("%d",&n);
if(n>20)
printf("n的值太大不能求解\n");
else
{
printf("%d皇后问题求解如下:\n",n);
queen(1,n); //放置1~n的皇后
}
}