算法:栈与回溯(非递归方法)
分析:每个皇后次从第一个格子放起。
放置一次就判断是否与前面的皇后是否冲突:place(line, array)
如果冲突就再往后放一格
碰到边界依旧不能放置就回溯
直到n个皇后放完,输出结果
/*
* main.cpp
*
* Created on: 2014年9月14日
* Describe: N皇后问题(n大于3)
* Input: 输入N皇后个数,以0结束
* Output: 输出棋盘与皇后位置,如无解输出“无解”
*/
#include <iostream>
#include <math.h>
using namespace std;
bool place(int line, int array[]) {
for (int i = 1; i < line; i++) {
if ((array[line] == array[i]) //在同一列上
|| (abs(array[line] - array[i]) == abs(line - i))) { //在同一对角线上
return false;
}
}
return true;
}
void queue(int n) {
int array[n + 1]; //用来代替栈
for (int i = 1; i <= n; i++) //初始化
array[i] = 0;
int k = 1;
while (k > 0) {
array[k] += 1; //在下一列放置皇后
while (array[k] <= n && !place(k, array)) //当该位置没有超出棋盘但不可以放置皇后时
array[k] += 1; //把皇后往后放一个
if (array[k] <= n && k == n) { //得到输出
for (int i = 1; i <= n; i++)
cout << array[i] << ' ';
cout << endl;
} else if (array[k] <= n && k < n) //没有到最后
k = k + 1; //放置下一个皇后
else {
array[k] = 0; //重置x[k],回溯
k = k - 1;
}
}
}
int main() {
int n = 0;
cin >> n;
while (n != 0) {
queue(n);
cin >> n;
}
return 0;
}