在NN的国际象棋棋盘上,如何放置N个皇后,使其不相互攻击。 要求: 1)编写第k号皇后是否可放置在棋盘上的判定算法:bool Placed(int k); 2)编写实现前4个皇后能否放置的随机算法bool nQueenLV(int stop); 3)编写实现后5到12号皇后能否放置的非递归回溯算法bool Backtrack(int step); 4)编写bool nQueen()函数,调用2)和3)算法,将结果打印到文件(Queen.txt)
时间: 2024-03-21 07:42:01 浏览: 147
好的,我明白了。下面是我的回答:
1)判断第k号皇后是否可放置在棋盘上的判定算法Placed(int k)可以使用以下方法:
- 检查同一行是否已经有皇后;
- 检查同一列是否已经有皇后;
- 检查对角线上是否已经有皇后。
可以用一个一维数组表示棋盘,数组下标表示行号,数组元素表示列号,即Queen[i] = j表示第i行的皇后在第j列。检查同一行和同一列是否已经有皇后很简单,只需要遍历数组即可。检查对角线上是否已经有皇后可以通过计算行差和列差是否相等来实现。
2)实现前4个皇后能否放置的随机算法bool nQueenLV(int stop)可以使用以下方法:
- 随机生成初始布局;
- 如果布局合法,则返回true;
- 否则,随机交换两个皇后的位置,继续检查布局是否合法;
- 如果连续stop次交换皇后的位置都不能得到合法布局,则返回false。
在这个算法中,stop是一个阈值,用来控制交换皇后的次数,避免陷入死循环。随机交换皇后的位置可以使用std::random_shuffle()函数来实现。
3)实现后5到12号皇后能否放置的非递归回溯算法bool Backtrack(int step)可以使用以下方法:
- 在第step行选择一个列放置皇后;
- 检查皇后是否和前面的皇后冲突;
- 如果冲突,则回溯到上一步,继续选择列放置皇后;
- 如果所有列都尝试过了,仍然无法放置皇后,则回溯到上一步;
- 如果成功放置了皇后,则继续递归放置下一行的皇后;
- 当所有行的皇后都放置完毕时,输出结果。
在这个算法中,可以使用一个数组book来记录哪些列已经被占用,哪些对角线已经被占用。具体来说,数组book[i]表示第i列是否被占用,数组book[n+j-i]表示右上至左下的对角线是否被占用,数组book[2*n+j+i]表示左上至右下的对角线是否被占用。
4)调用2)和3)算法,将结果打印到文件(Queen.txt)的nQueen()函数如下所示:
```cpp
#include <iostream>
#include <fstream>
#include <ctime>
#include <algorithm>
using namespace std;
const int MAXN = 20;
int Queen[MAXN]; // 皇后的位置
int book[MAXN]; // 记录列和对角线是否被占用
// 判断第k号皇后是否可放置在棋盘上
bool Placed(int k)
{
for (int i = 0; i < k; i++)
{
if (Queen[i] == Queen[k] || abs(Queen[i] - Queen[k]) == abs(i - k))
return false;
}
return true;
}
// 随机交换两个皇后的位置
bool SwapQueen(int n)
{
int cnt = 0;
while (cnt < n)
{
int i = rand() % n;
int j = rand() % n;
swap(Queen[i], Queen[j]);
if (Placed(n))
return true;
swap(Queen[i], Queen[j]);
cnt++;
}
return false;
}
// 使用回溯算法求解n皇后问题
bool Backtrack(int n)
{
int i = 0, j = 0;
while (i
阅读全文