Algorithme de retour en arrière - problème de n reines

Qu’est-ce que l’algorithme de backtracking ?
La méthode de backtracking peut généralement résoudre les problèmes suivants :
      Problèmes de combinaison, problèmes de permutation, problèmes de sous-ensembles, problèmes d'échiquier et autres problèmes ;
Le problème n-reine est l'un des problèmes de l'échiquier ;
Les problèmes à résoudre par la méthode de backtracking peuvent être résumés dans une structure arborescente, qui peut être comprise comme un arbre N-aire ;
La méthode de retour en arrière utilise la récursion pour rechercher de manière récursive des sous-ensembles dans un ensemble. La taille de l'ensemble peut être comprise comme la couche qui nécessite la récursion ;
Et lors de l'utilisation de la récursivité, il doit y avoir une condition de fin , sinon il ne pourra pas quitter le corps de la fonction et une erreur se produira. Cet arbre N-aire est donc limité ;
Le processus d’algorithme de backtracking :
 
         1. Retracez les paramètres saisis par la fonction et la valeur de retour, c'est un corps de fonction

         2. Condition de résiliation : parce qu'elle est récursive, il doit y avoir une condition de résiliation

         3. Algorithme de backtracking de base

                 Arbre N-aire : (

                     boucle for : traversée horizontale

                      Récursivité : parcours vertical

                )

         4. Valeur de retour de sortie

Ceci est l'introduction principale de l'algorithme de backtracking

Commençons par chercher des questions pour commencer ! ! !

Si cela vous aide, donnez-moi un coup de pouce ! ! !    



Exigences des questions

     Placez n reines sur un échiquier n*n afin qu'elles ne puissent pas s'attaquer. Autrement dit, deux reines ne peuvent pas être dans la même ligne, colonne ou diagonale. Combien y a-t-il de façons de les placer ?

     Format d'entrée : 8

     Format de sortie : 92

Analyse des questions

1. Pour l'échiquier n dame, il y a ces règles

      1. Ne peut pas être sur la même ligne

      2. Ne peut pas être dans la même colonne

      3. Ne peut pas être sur la même ligne oblique

Normalement, pour un échiquier, on utilisera un tableau à deux dimensions

Mais pour cette règle du jeu, nous pouvons savoir que l'utilisation d'un tableau unidimensionnel est acceptable, car une seule pièce d'échecs peut être placée dans chaque rangée.

2. Pour ces trois règles, notre couche principale doit avoir deux jugements ( utiliser des tableaux unidimensionnels, pas besoin de considérer les problèmes de lignes )

      Lorsque vous vous préparez à placer une reine dans la colonne actuelle, vous devez déterminer :   

1. La position actuelle de la reine est-elle dans la même colonne      que la reine qui a été placée auparavant ? Si c'est le cas, changez la colonne jusqu'à ce que la Nième colonne ( atteigne la limite ). Vous devez revenir à la rangée de reines précédente et modifier la position. colonne de la rangée de reines précédente.

2. La position actuelle de la reine est-elle sur la même pente      que la reine placée précédemment ( c'est-à-dire 45° ou 135° ) ? Si c'est le cas, changez de colonne jusqu'à ce que la Nième colonne ( atteigne la limite ), et vous devez revenir à la précédente. rangée de reines. , change la colonne de la reine de la rangée précédente.

3. Conditions de terminaison dans le processus récursif

     On peut penser à l'algorithme de retour en arrière : l'explication la plus simple est que la route actuelle est bloquée, que faire, revenir en arrière, revenir à la position précédente et changer de direction ;

      La condition de fin n'est-elle pas que vous soyez revenu à la première étape et atteint la dernière position de la première étape ? S'il n'y a pas d'autre choix, alors c'est fini. Pourquoi rester ici alors qu'il n'y a aucun chemin à parcourir ? Hahahaha ;

   

Code



#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;	
}

La création n'est pas facile, merci de laisser des commentaires, de suivre et d'aimer pour éviter de vous perdre ! ! !

La création n'est pas facile, merci de laisser des commentaires, de suivre et d'aimer pour éviter de vous perdre ! ! !

La création n'est pas facile, merci de laisser des commentaires, de suivre et d'aimer pour éviter de vous perdre ! ! !

Je suppose que tu aimes

Origine blog.csdn.net/weixin_59367964/article/details/127986711
conseillé
Classement