【递归入门】n皇后 问题(原始的8皇后问题)
时间限制: 1 Sec 内存限制: 128 MB
题目描述
会下国际象棋的人都很清楚:皇后可以在横、竖、斜线上不限步数地吃掉其他棋子。如何将8个皇后放在棋盘上(有8 * 8个方格),使它们谁也不能被吃掉!这就是著名的八皇后问题。
输入
一个整数n( 1 < = n < = 10 )
输出
每行输出对应一种方案,按字典序输出所有方案。每种方案顺序输出皇后所在的列号,相邻两数之间用空格隔开。如果一组可行方案都没有,输出“no solute!”
样例输入
4
样例输出
2 4 1 3 3 1 4 2
AC代码:
#include<iostream>
#include<math.h>
using namespace std;
int n; //N*N棋盘及皇后的个数
int pos[105] = {0}; //存放每行皇后的列值。若pos[i]的值t,表示第i行皇后所在的列为t
bool flag = false; //是否有解的标志
void dfs(int x) //x表示第x行皇后,每次递归表示放置第x个(行)皇后
{
if (x == n + 1) //满足状态,输出每行皇后所在的列
{
flag = true;
for (int i = 1; i <= n; i++)
{
if (i > 1)cout << " ";
cout << pos[i];
}
cout << endl;
return;
}
for (int i = 1; i <= n; i++) //将X皇后试着放置在每一列(i列)
{
pos[x] = i;
bool conf = true; //是否与其它皇后冲突的标志
for (int j = 1; j < x; j++) //遍历与之前放置的皇后是否冲突
{
if (i == pos[j] || x - j == abs(i - pos[j])) //因为递归的时候已保证不同行,所以只需判断是否同列或者是否在主对角线与副对角线。条件可画图好好体会
{
conf = false;
break;
}
}
if (conf)dfs(x + 1); //若不冲突,继续放置下一个皇后
}
}
int main()
{
cin >> n;
dfs(1);
if (!flag)cout << "no solute!" << endl;
return 0;
}
PS:可提前打表