2. Condição de rescisão; por ser recursivo, deve haver uma condição de rescisão
3. Algoritmo de retrocesso central
Árvore N-ária: (
for loop: travessia horizontal
Recursão: travessia vertical
)
4. Valor de retorno de saída
Esta é a introdução central ao algoritmo de retrocesso
Vamos começar a procurar perguntas para começar! ! !
Se isso te ajudar, por favor, me dê um joinha! ! !
Requisitos de perguntas
Coloque n rainhas em um tabuleiro de xadrez n*n de modo que elas não possam atacar umas às outras. Ou seja, duas rainhas não podem estar na mesma linha, coluna ou diagonal. Quantas maneiras existem de colocá-las?
Formato de entrada: 8
Formato de saída: 92
Análise de perguntas
1. Para o tabuleiro de xadrez da rainha, existem estas regras
1. Não pode estar na mesma linha
2. Não pode estar na mesma coluna
3. Não pode estar na mesma barra
Normalmente, para um tabuleiro de xadrez, usaremos um array bidimensional
Mas para esta regra do jogo, podemos saber que usar uma matriz unidimensional é bom, porque apenas uma peça de xadrez pode ser colocada em cada linha
2. Para essas três regras, nossa camada central deve ter dois julgamentos ( use matrizes unidimensionais, sem necessidade de considerar problemas de linha ) .
Ao se preparar para colocar uma rainha na coluna atual, você precisa determinar:
1. A posição atual da rainha está na mesma coluna da rainha que foi colocada antes ? Em caso afirmativo, altere a coluna até a enésima coluna ( atingir o limite ). Você precisa voltar para a linha anterior de rainhas e alterar a posição da rainha. coluna da linha anterior de rainhas.
2. A posição atual da rainha está na mesma inclinação da rainha colocada anteriormente ( ou seja, 45° ou 135° )? Em caso afirmativo, mude a coluna até a enésima coluna ( atingir o limite ) e você precisará voltar para a posição anterior linha de rainhas. , altera a coluna da rainha da linha anterior.
3. Condições de rescisão no processo recursivo
Podemos pensar no algoritmo de retrocesso, a explicação mais direta é que a estrada atual está bloqueada, o que fazer, voltar, voltar à posição anterior e mudar de direção;
A condição de término não é que você tenha voltado ao primeiro degrau e alcançado a última posição do primeiro degrau? Se não houver outra escolha, então acabou. Por que continuar ficando quando não há como ir? Hahahaha ;
Código
#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;
}
A criação não é fácil, deixe comentários, siga e curta para não se perder! ! !
A criação não é fácil, deixe comentários, siga e curta para não se perder! ! !
A criação não é fácil, deixe comentários, siga e curta para não se perder! ! !