输出n-皇后的所有可行解 (10分)
在n×n的国际棋盘上放置n个皇后,使得每个皇后都不受到攻击,即任意二个皇后不能位于同行或同列或同一条斜线上。解题思路:将棋盘从左至右,从上到下编号为0,…,n-1,皇后编号为0,…,n-1。设解为(x0,…, xn-1) , 皇后i放在棋盘的第i行的第xi列上。 约束条件为:
xi≠xj(不在一列上)
xi-i≠xj-j(不在一条斜线上)
xi+i≠xj+j(不在一条斜线上) 2)和3)等价于:|i-j|≠|xi-xj|
采用回溯算法思想,解决n个皇后问题的代码如下所示,请补充函数Place()的代码,要求输出n-皇后的所有可行解,输出列号(0~n-1)
函数接口定义:
bool place(int k, int i, int *x){ }
其中 k、 i 和 *x 都是用户传入的参数。
裁判测试程序样例:
#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cmath>
#include <cstring>
using std::cin;
using std::cout;
using std::endl;
int n; //皇后个数
bool place(int k, int i, int *x);
void nQueens(int k, int n, int *x);
int main()
{
cin>>n;
int *x = new int [n + 1];
if(n == 2 || n==3)
cout << "0" <<endl;
nQueens(0, n, x);
return 0;
}
/* 请在这里填写答案 */
void nQueens(int k, int n, int *x)
{
for(int i = 0; i < n; i++)
{
if(place(k, i, x))
{
x[k] = i;
if(k == n - 1)
{
for(i = 0; i < n; i++) cout << x[i] << " ";
cout << endl;
}
else
nQueens(k+1, n, x);
}
}
}
输入样例:
4
输出样例
1 3 0 2
2 0 3 1
这道题,刚开始主要是不懂i,k,…都代表什么意思。。。
搞得好迷。。。。。。。
好在最后搞出来了:
bool place(int k, int i, int* x) {
//k代表第k个皇后,同时代表第k行,i是列
for (int j = 0; j < k; j++) {
if (x[j] == i)
return false;
else if(abs(i -x[j]) == abs(k - j))
{
return false;
}
}
return true;
}
建议用手画一下图,会有很大的帮助的。。。