问题:N皇后问题是指在N*N的棋盘上摆放N个皇后,使得任意两个皇后都不在同一行、同一列或者同一斜线上,求满足这种摆放的解为多少个
解题思路:
(1)定义判断函数:不同行(每行只放置一个皇后);不同列(放置前进行遍历,即将放置的皇后与之前所有皇后所在列不同);不同斜线(放置前进行遍历,即将放置的皇后与之前所有皇后练成线的斜率不为±1)
(2)定义递归的回溯函数,并调用判断函数。若在该行遍历完n之前能够找到位置放置皇后,则向下一行递归,若没有位置,则向上回溯。如果棋盘所有行列寻找完毕,则解的个数+1
#include <iostream>
using namespace std;
#define max 50
int x[max + 1];//第i行的皇后放在第x[i]列上
int n;//棋盘宽度以及皇后数量
int sum=0;//计算解的数量
//即将放入的皇后坐标为(row,col),判断是否能够放置
bool Place(int row, int col) {
for (int i = 1; i < row; i++) //比较之前row -1行已经放置的皇后
{
if (col == x[i] || abs(row - i) == abs(col - x[i])) //判断即将放的皇后与已经存在的皇后们是否处于同一列或同一斜线
return false;
}
return true;
}
//递归的回溯函数,若满足条件则往下递归,若不满足条件,则往前回溯
void Backtrack(int t,int n) {
if (t == n+1) //成功将全部棋盘遍历了一次,形成了一个解
sum++;
else {
//若这一行遍历到n仍不能放置皇后,则向前回溯
for (int i = 1; i <= n; i++) {
x[t] = i;
if (Place(t, x[t]))//判断是否能放置皇后
Backtrack(t + 1, n);//若这一行能放置皇后,则向下一行进行递归
}
}
}
int main()
{
cout << "请输入皇后的数量: ";
cin >> n;
Backtrack(1,n);
cout << "解的个数为: " << sum<<endl;
return 0;
}