问题描述:
在 n×n 格的棋盘上放置彼此不受攻击的 n 个皇后。按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。n 后问题等价于在 n×n 格的棋盘上放置 n 个皇后,任何 2 个皇后不放在同一行或同一列或同一斜线上。
编程任务:
设计一个解 n 后问题的队列式分支限界法,计算在 n * n 个方格上放置彼此不受攻击的 n 个皇后的一个放置方案。
数据输入:
输入第一行有 1 个正整数 n。 1 <= n <= 12
结果输出:
将计算出的彼此不受攻击的 n 个皇后的第一个放置方案输出。
样例输入:
5
样例输出:
1 3 5 2 4
代码(cpp):
#include <iostream>
#include <stdlib.h>
using namespace std;
int n=0;
int d[21];
bool flag = false;
void backtrack(int);
bool check(int);
int main()
{
cin>>n;
backtrack(1);
for(int i=1;i<n;i++)
cout<<d[i]<<' ';
cout<<d[n];
}
void backtrack(int k){
if (k == n+1){
flag=true;
return;
}
for (int i=1;i<=n;i++){
d[k] = i;
if (check(k))
backtrack(k+1);
if (flag)
return;
d[k] = 0;
}
}
bool check(int k){
for (int i=1;i<=k;i++)
for (int j=i+1;j<=k;j++)
if (d[i] == d[j] || abs(d[i] - d[j]) == abs(i-j))
return false;
return true;
}
仅供学习,错误指正,搬运注明出处!