/*
N*N的棋盘上,放置N个皇后,要求,任意两个皇后不能在同一行,同一列,同一对角线。求有多少种放法
*/
//思路:最后N个皇后肯定是每列一个,每行一个。固定行,
#include<stdio.h>
#define N 8 //8个皇后
int count = 0;//放法计数
int column[N];
//row表示第row行,column[row]表示第row行的皇后所在的列
void Queen(int row)//放置第row行的皇后,row从0---N-1
{
if (row == N)//row==N时表示N个皇后已经全部排列完成了
{
count++;
for (int i = 0; i < N; i++)
{
printf("(%d,%d) ", i, column[i]);//输出皇后位置
}
printf("\n");
return;
}
for(int i=0;i<N;i++)//从0-N-1列放置皇后
{
column[row] = i;//皇后位置为(row,i),row行,i列
int ok = 1;//判断是不是进行下一次递归
for (int j = 0; j < row; j++)//和前面row行的几个皇后比较,看列条件和对角条件是否满足
{
//column[row]==column[j]表示两个皇后在同一列
//row+column[row]==j+column[j]表示两个皇后在主对角线上
//row-column[row]==j-column[j]表示两个皇后在副对角线上
if (column[row] == column[j] || row + column[row] == j + column[j] || row - column[row] == j - column[j])
{
ok = 0;
break;//不满足的话,进行外层for的下一次循环,将row行的皇后往后放一列
}
}
if (ok == 1)//防止j=row时,自动进行下一次递归
{
Queen(row + 1);
}
}
}
int main(void)
{
Queen(0);
printf("%d\n",count);
return 0;
}
答案:92。
八皇后问题
最新推荐文章于 2023-07-07 14:04:01 发布