一、问题描述
在nXn的方格棋盘上放置n个皇后要求每个皇后不同行、不同列、不同对角线,求解放置方法
二、算法
利用一维数组a[n]来解决问题,建立横坐标为n,纵坐标为a[n]的棋盘,皇后位置用(i,a[i])表示。
题目要求每个皇后不同行、不同列、不同对角线.
若同列则a[k]==j,
若为对角线位置,则会构成等腰三角形,则|a[k]-j|==|i-k|
所以以下位置不可放置皇后
(a[k]==j)||(abs(a[k]-j)==abs(i-k))
搜索时逐列寻找,在第i行上试探每一个列j,找到与前i-1个皇后不冲突的位置
三、代码
#include<stdio.h>
#include<stdlib.h>
#define N 20
int a[N];
int count=0;
//输出解
void fun1(int n)
{
int i;
printf("第%d个解:",++count);
for(i=1;i<=n;i++)
printf("(%d,%d)",i,a[i]);
printf("\n");
}
//判断该位置能否摆放皇后
bool fun2(int i,int j)
{
if(i==1)return true;
int k= 1;
while(k<i)
{
if((a[k]==j)||(abs(a[k]-j)==abs(i-k)))
return false;
k++;
}
return true;
}
//放置皇后
void fun3(int i,int n)
{
int j=1;
if(i>n)
fun1(n);
else
{
for(j=1;j<=n;j++)
if(fun2(i,j))
{
a[i]=j;
fun3(i+1,n);
}
}
}
int main()
{
int n;
scanf("%d",&n);
fun3(1,n);
}