问题:N皇后问题是指在N*N的棋盘上摆放N个皇后,使得任意两个皇后都不在同一行、同一列或者同一斜线上,求满足这种摆放的解为多少个
解题思路:
(1)定义判断函数:不同行(每行只放置一个皇后);不同列(放置前进行遍历,即将放置的皇后与之前所有皇后所在列不同);不同斜线(放置前进行遍历,即将放置的皇后与之前所有皇后练成线的斜率不为±1)
(2)定义递归的回溯函数,并调用判断函数。若在该行遍历完n之前能够找到位置放置皇后,则向下一行递归,若没有位置,则向上回溯。如果棋盘所有行列寻找完毕,则解的个数+1
#include<iostream>usingnamespace std;#define max 50int x[max +1];//第i行的皇后放在第x[i]列上int n;//棋盘宽度以及皇后数量int sum=0;//计算解的数量//即将放入的皇后坐标为(row,col),判断是否能够放置boolPlace(int row,int col){for(int i =1; i < row; i++)//比较之前row -1行已经放置的皇后{if(col == x[i]||abs(row - i)==abs(col - x[i]))//判断即将放的皇后与已经存在的皇后们是否处于同一列或同一斜线returnfalse;}returntrue;}//递归的回溯函数,若满足条件则往下递归,若不满足条件,则往前回溯voidBacktrack(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);//若这一行能放置皇后,则向下一行进行递归}}}intmain(){
cout <<"请输入皇后的数量: ";
cin >> n;Backtrack(1,n);
cout <<"解的个数为: "<< sum<<endl;return0;}
版权归原作者 Yua_H 所有, 如有侵权,请联系我们删除。