问题描述:
八皇后问题最早是由国际西洋棋棋手马克斯·贝瑟尔于1848年提出。在8×8格的国
际象棋棋盘上放置八个皇后,使得任意两个皇后不能互相攻击,即任何行、列或对角
线(与水平轴夹角为45°或135°的斜线)上不得有两个或两个以上的皇后。这样的
一个格局称为问题的一个解。
问题分析:
一个正确的解应当是每一列,每一行,每一条斜线上均只有一个皇后。
借用的图示:
#include<stdio.h>
#include<string.h>
#define N 8
int p[N+1];
int num;
void show()
{
printf("\t%d\n",++num);
for(int i=1;i<=N;i++){
for(int j=1;j<=N;j++){
if(p[i]==j){
printf(" *");
}
else{
printf(" .");
}
}
printf("\n");
}
}
int check(int n,int k)
{
for(int i=1;i<n;i++){//判断前 n 行上是否有要填的位置有歧义的 ,不包括该行
if(p[i]==k) return 0;
if(p[i]-i==k-n) return 0;
if(p[i]+i==k+n) return 0;
}
return 1;
}
void find(int n)
{
if(n>N){
show();
return ;
}
else{
for(int i=1;i<=N;i++){
if(check(n,i)){
p[n]=i; // n 为数组 p 的下标,记下列
find(n+1);
}
}
}
}
int main()
{
memset(p,0,sizeof(p));
num=0;
find(1);
return 0;
}