n皇后问题
要在n*n的国际象棋棋盘中放n个皇后,使任意两个皇后都不能互相吃掉。规则:皇后能吃掉同一行、同一列、同一对角线的任意棋子。求所有的解。n=8是就是著名的八皇后问题了。
听学长讲了一种是用for循环的,觉得有点麻烦,因为不仅要判断同行同列,还要再判断对角线,用到回溯,标记和取消标记,容易搞乱,查了一种用公式的,超级好理解。
就是行等于列,还有对角线上的都不满足,标记下,最后筛出满足条件的即可。
#include<stdio.h>
#include<math.h>
#define MAX 8
int sum=0;
int s[MAX];
void result()
{
int i;
sum+=1;
printf("第%d种:",sum);
for(i=0;i<MAX;i++)
{
printf("(%d,%d) ",i,s[i]);
}
printf("\n");
}
int check_chess(int n)
{
int i;
for(i=0;i<n;i++)
{
if(s[i]==s[n]||(n-i)==abs(s[i]-s[n]))//行等于列,对角线上的
{
return 1;
}
}
return 0;
}
void put_chess(int n)
{
int i;
for(i=0;i<MAX;i++)
{
s[n]=i;
if(!check_chess(n))
{
if(n==MAX-1)
{
result();
}
else
{
put_chess(n+1);
}
}
}
}
int main()
{
put_chess(0);
}