在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上。 你的任务是,对于给定的N,用c语言求出有多少种合法的放置方法
时间: 2023-05-22 21:06:15 浏览: 191
n皇后问题C语言实现:在n*n的棋盘上放置n个皇后,要求皇后两两互斥,即任意两个皇后不能出现在同一行、同一列或同一条斜对角线上。 试求出所有的合法布局。
5星 · 资源好评率100%
这是一个经典问题,称为 N 皇后问题。一种基于回溯算法的解法如下:
使用一个数组 queen 存放每行的皇后所在列数,从第一行开始尝试放置皇后。遍历每列,若当前列可以放置皇后,则将皇后放到该列,并递归到下一行。当递归到最后一行时,说明找到了一种可行的放置方法,计数器加一并返回;否则回溯到上一行,继续尝试下一列。
判断当前列是否可以放置皇后,需要检查到当前行为止的所有列和两条对角线上是否已存在皇后。可用一个数组 used 记录已使用的列和两条对角线的情况,若某一位为真,则表示该列或对角线已被占用。
C 语言的实现示例代码如下:
```c
#include <stdio.h>
int queen[20]; // 存放每行皇后所在列数
int used[40]; // 存放是否占用某列或对角线
int count = 0; // 计数器
// 尝试放置皇后
void putQueen(int row, int n) {
if (row == n) { // 找到一种合法解法
count++;
return;
}
for (int col = 0; col < n; col++) {
// 判断当前列和对角线是否可用
if (!used[col] && !used[row + col] && !used[row - col + n]) {
queen[row] = col;
used[col] = used[row + col] = used[row - col + n] = 1;
putQueen(row + 1, n);
used[col] = used[row + col] = used[row - col + n] = 0;
}
}
}
int main() {
int n = 8; // 棋盘大小
putQueen(0, n); // 从第 0 行开始放置
printf("共有 %d 种放置方法\n", count);
return 0;
}
```
此代码求解 8 皇后问题,输出为:
```
共有 92 种放置方法
```
阅读全文