2. 终止条件;因为是递归,就一定要有终止条件
3. 核心回溯算法
N叉树:(
for循环:横向遍历
递归 :纵向遍历
)
4.输出返回值
这就是回溯算法的核心介绍
下面就开始找题来上手!!!
对你有帮助就动动发财的小手点个赞 !!!
题目要求
在n*n格的棋盘上摆放n个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一对角线上,问有多少种摆法。
输入格式 :8
输出格式 :92
题目分析
一、对于n皇后这个棋盘,有这些规则
1.不能同一行
2.不能同一列
3.不能在同一斜线上
正常情况下,对于一个棋盘,我们都会使用二维数组
但是对于这个游戏规则,我们可以知道使用一维数组,就行,因为每一行只能放一个棋子
二、对于这三个规则,所以我们的核心层就应该,有两个判断(使用一维数组,不用考虑行上的问题)
当你在准备在当前这一列上放皇后,需要判断:
1. 当前皇后位置与之前已经放好的皇后是否在同一列,是,就更换列,一直到第N列(到了边界),就需要回溯到上一行皇后,更改上一行皇后的列。
2. 当前皇后位置与之前已经放好的皇后是否在同一斜线上(即45°或135°),是,就更换列,一直到第N列(到了边界),就需要回溯到上一行皇后,更改上一行皇后的列。
三、递归过程中的终止条件
我们可以思考,回溯算法,用最直白的话解释就是,当前这路不通,怎么办,回去,到上一个位置换个方向;
那终止条件不就是,你一直回溯到了第一步,并且走到了第一步的最后一个位置,没有其他选择了,那就结束呗,无路可走还继续呆着干嘛,哈哈哈哈;
代码实现
#include<bits/stdc++.h>
using namespace std;
int main(){
int n,sum=0;
cin>>n;
int HANG= 0;//皇后个数,行数;
int LIE = 0;//皇后占据的列为;
int queen[n] = {0};//储存皇后的位置,值为列;
while(1){
int AK = 0; //攻击
if(HANG== 1 && queen[0] == 7 && LIE == 7)break;//终止条件
//判断是否在同一列,统一斜线
for(int i=0;i<HANG;i++)
{
if(queen[i] == LIE)AK = 1; //同一列,攻击
if(HANG-i == queen[i]-LIE ||HANG-i == -(queen[i]-LIE) )AK = 1;//同一斜线,攻击
}
//判断可不可以放入
if(AK == 0)
{ //表示可以放置
queen[HANG] = LIE;
HANG++; LIE = 0;
if(HANG== 8)sum++;
}
else
{
LIE++;
while(LIE>=8)
{ //回朔,上一个皇后往后移一格
HANG--;
LIE = queen[HANG]+1;
}
}
}
cout<<sum<<endl;
return 0;
}
创作不易,欢迎评论留言,关注点赞不迷路!!!
创作不易,欢迎评论留言,关注点赞不迷路!!!
创作不易,欢迎评论留言,关注点赞不迷路!!!