C ++ Blue Bridge Cup Prática básica 2n Queen Problem HERODING's Road to the Blue Bridge Cup

Limite de recursos Limite de
tempo: 1.0s Limite de memória: 512.0MB
Descrição do problema
  Dado um quadro n * n, existem alguns lugares no quadro que não podem ser usados ​​pela rainha. Agora precisamos colocar n rainhas pretas e n rainhas brancas no quadro para que duas rainhas pretas não fiquem na mesma linha, mesma coluna ou mesma diagonal, quaisquer duas rainhas brancas não estejam na mesma linha Na mesma coluna ou na mesma diagonal. Pergunte quantos tipos de métodos de liberação no total? n é menor ou igual a 8.
Formato de entrada
  A primeira linha de entrada é um número inteiro n, indicando o tamanho do tabuleiro de xadrez.
  Nas próximas n linhas, existem n números inteiros de 0 ou 1. Em cada linha, se um número inteiro for 1, indica que a posição correspondente pode ser colocada como rainha. Se um número inteiro for 0, indica que a posição correspondente não pode ser colocada como rainha.
O formato de saída
  gera um número inteiro, indicando quantos tipos de métodos de colocação no total.
Entrada de amostra
4
1 1 1 1 1
1 1 1 1
1 1 1 1
1 1 1 1
Saída
de
amostra 2 Entrada de amostra
4
1 0 1 1
1 1 1 1
1 1 1 1
1 1 1 1 1
Saída de amostra
0

Idéias para a solução de problemas:
para ser sincero, fiquei intrigado quando vi esse problema. Antes de tudo, não sabia nada sobre xadrez (depois não sabia que tinha algo a ver com isso). Segundo, em minhas suposições subjetivas, n peças estavam em n * Como todas as matrizes n satisfazem linhas diferentes, colunas diferentes e não na mesma linha diagonal, então comecei a encarar a programação do Baidu com vergonha (sem saber vergonha), através da explicação de um irmão mais velho, de repente comecei e me arrependi. ┮﹏┭┮
Voltando à verdade, ele começou a explicar suas idéias. A seção de código é dividida em seção de função de julgamento (incluindo preto e branco), seção de função de posicionamento (incluindo preto e branco), função principal. O processo é: primeiro coloque peças pretas, use profundidade primeiro e para loops, quase todo o quadro é visitado uma vez, toda vez que você faz um julgamento condicional, se o julgamento for bem-sucedido, você pode continuar chamando recursivamente, caso contrário, dessa forma não funcionará gg. Em seguida, o layout das peças de xadrez preto é concluído e as peças de xadrez brancas são organizadas; o princípio é o mesmo que o das peças de xadrez preto. Finalmente, imprima o número de sucessos.

#include<bits/stdc++.h>

using namespace std;

const int maxn = 10;  
int n;  
int map_Q[maxn][maxn];  
int posb[maxn]={0};  //黑皇后 
int posw[maxn]={0};  //白皇后 
int ans;   
 
bool checkw( int cur) //检查函数
{  
    for( int i = 1; i < cur; i++)  
        if( posw[i] == posw[cur] || abs(i-cur) == abs(posw[i]-posw[cur]))  //如果列相等或者在斜对角线上 
            return false;  
    return true;  
}   
 
bool checkb( int cur)  //检查函数
{  
    for( int i = 1; i < cur; i++)  
        if( posb[i] == posb[cur] || abs(i-cur) == abs(posb[i]-posb[cur]))  //如果列相等或者在斜对角线上 
            return false;  
    return true;  
}  
 
void dfs_white( int cur)  //深度优先算法 
{  
    if( cur == n+1)  //白皇后也全部放完,次数+1
    {  
        ans++;  
      }
    for( int i = 1; i <= n; i++)  
    {  
        if( posb[cur] == i) //表示第cur列的第i行位置已经被黑皇后占用,
            continue;        //结束当前循环,i+1
        if( map_Q[cur][i] == 0)  //再判断前提条件是否成立
            continue;  
        posw[cur] = i;    //尝试把第cur列的白皇后放在第i行上
        if( checkw(cur))   //判断能否放置白皇后
            dfs_white(cur+1);  //递归
    }  
}  
  
void dfs_black( int cur)  
{  
    if( cur == n+1)  //当黑皇后处理完时,再处理白皇后
    {  
        dfs_white(1);  
    }  
    for( int i = 1; i <= n; i++)  
    {  
       if( map_Q[cur][i] == 0)  //如果第cur列第i行满足放皇后的前提条件即 mp[cur][i] == 1
            continue;  //如果不满足,则结束当前循环,进行下一次循环即i+1。
         posb[cur] = i;     //就尝试把第cur列的黑皇后放在第i行上
        if( checkb(cur))   //然后判断该尝试是否成立,如成立,则进行递归,如不成立,则尝试把当前列的黑皇后放在下一行(i+1行)上。
            dfs_black(cur+1);  //递归
    }  
}  
  
int main()  
{     
   cin >> n;
   for( int i = 1; i <= n; i++)   //定义棋盘
       for( int j = 1; j <= n; j++)  
           cin >> map_Q[i][j];    
   ans = 0;  
   dfs_black(1);    //先把黑皇后放在第一列
   cout << ans << endl; 
   
    return 0;  
}

Obrigado a este irmão mais velho por explicar, o código é semelhante ao do irmão mais velho, adicionou alguns comentários para facilitar o entendimento e anexou o link: link .

Publicado 7 artigos originais · Gostei8 · Visitantes 805

Acho que você gosta

Origin blog.csdn.net/HERODING23/article/details/105650555
Recomendado
Clasificación