8皇后问题
描述:
八皇后问题是大数学家高斯于1850年提出来的。该问题是在8×8的国际象棋棋盘上放置8个皇后,使得没有一个皇后能“吃掉”任何其他一个皇后,即没有任何两个皇后被放置在棋盘的同一行、同一列或同一斜线上。
输出8皇后问题所有结果。
输入:
没有输入。
输出:
每个结果第一行是No n:的形式,n表示输出的是第几个结果;下面8行,每行8个字符,‘A’表示皇后,‘.’表示空格。不同的结果中,先输出第一个皇后位置靠前的结果;第一个皇后位置相同,先输出第二个皇后位置靠前的结果;依次类推。
输入样例:
输出样例:
输出的前几行:
No 1:
A.......
....A...
.......A
.....A..
..A.....
......A.
.A......
...A....
No 2:
A.......
.....A..
.......A
..A.....
......A.
...A....
.A......
....A...
答案:
#include<stdio.h>
#include<math.h>//要用到绝对值函数
inta[8];
intcounter=1;//计数器
voidsearch(int m); //递归函数
intcanplace(int row,int col);//判断是否满足八皇后的条件
voidoutput();
intmain()
{
search(0);//初始化为0
}
voidsearch(int m)
{
int i;
if(m==8)
{
output();
}
else
{
for(i=0;i<8;i++)
{
if(canplace(m,i))
{
a[m]=i;
search(m+1);
}
}
}
}
intcanplace(int row,int col)
{
int i,flag=1;
for(i=0;i<row;i++)
{
if(a[i]==col||fabs(row-i)==fabs(col-a[i]))
{
flag=0;
break;
}
}
return(flag);
}
voidoutput ()
{
int i,j;
printf("No ");
printf("%d",counter);
printf(":\n");
counter++;
for(i=0;i<8;i++)
{
for(j=0;j<8;j++)
{
if(j==a[i])printf("A");
else printf(".");
}
printf("\n");
}
}
注意:
-
本题用a[m]=j来表示皇后在第m行第j列,所以输出时一行只有一个皇后,故在canplace中无需再判断
-
输出时要二重循环才能输出矩阵
-
a[i]==col 表示同一列的前n-1行中有皇后
-
fabs(row-i)==fabs(col-a[i]) 表示在同一斜线上或在同一反斜线上