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 ! ! !