回溯算法——n皇后问题

什么是回溯算法?
回溯法,⼀般可以解决如下几种问题:
      组合问题、排列问题、子集问题、 棋盘问题 等问题
n皇后问题就是其中的棋盘问题
回溯法要解决的问题都可以抽象为树形结构,可以理解为N叉树;
回溯法使用递归,在一个集合中递归找子集,集合的大小就可以理解为需要递归的层;
并且使用递归就要有终止条件,不然就在函数体中出不来,会出错。所以这颗N叉树就是有限的;
回溯算法的流程:
 
         1. 回溯函数进入的参数以及返回值;就是一个函数体

         2. 终止条件;因为是递归,就一定要有终止条件

         3. 核心回溯算法

                 N叉树:(

                     for循环:横向遍历

                      递归 :纵向遍历

                )

         4.输出返回值

这就是回溯算法的核心介绍

下面就开始找题来上手!!!

对你有帮助就动动发财的小手点个赞 !!!    



题目要求

     在n*n格的棋盘上摆放n个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一对角线上,问有多少种摆法。

     输入格式    :8

     输出格式    :92

题目分析

、对于n皇后这个棋盘,有这些规则

      1.不能同一行

      2.不能同一列

      3.不能在同一斜线上

正常情况下,对于一个棋盘,我们都会使用二维数组

但是对于这个游戏规则,我们可以知道使用一维数组,就行,因为每一行只能放一个棋子

、对于这三个规则,所以我们的核心层就应该,有两个判断(使用一维数组,不用考虑行上的问题

      当你在准备在当前这一列上放皇后,需要判断:   

     1. 当前皇后位置与之前已经放好的皇后是否在同一列,是,就更换列,一直到第N列(到了边界),就需要回溯到上一行皇后,更改上一行皇后的列。

     2.  当前皇后位置与之前已经放好的皇后是否在同一斜线上(即45°或135°),是,就更换列,一直到第N列(到了边界),就需要回溯到上一行皇后,更改上一行皇后的列。

、递归过程中的终止条件

     我们可以思考,回溯算法,用最直白的话解释就是,当前这路不通,怎么办,回去,到上一个位置换个方向;

      那终止条件不就是,你一直回溯到了第一步,并且走到了第一步的最后一个位置,没有其他选择了,那就结束呗,无路可走还继续呆着干嘛,哈哈哈哈;

   

代码实现



#include 

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=8)
			 {	//回朔,上一个皇后往后移一格
			     HANG--;				
				 LIE = queen[HANG]+1;	
			 }
		}
   }
	cout<

创作不易,欢迎评论留言,关注点赞不迷路!!!

创作不易,欢迎评论留言,关注点赞不迷路!!!

创作不易,欢迎评论留言,关注点赞不迷路!!!

你可能感兴趣的:(算法)