Résumé de la question - La vengeance du pion

Résumé de la question - La vengeance du pion


Description du titre
sujet

Au début, je n'avais aucune idée sur ce sujet (j'ai découvert plus tard que ce n'était pas difficile, car je n'avais pas très bien appris). Plus tard, j'ai cherché des informations sur Internet et j'ai probablement compris le idée de ce sujet. Le problème est que lorsqu'il n'y a déjà qu'une seule pièce K, en ajoutant un nombre minimum de pièces de pion, toutes les pièces * de l'adversaire peuvent être attaquées. Parmi elles, K peut attaquer les huit autres directions, et les pièces de pion ne peuvent attaquer. le coin supérieur gauche et le coin supérieur droit dans deux directions.

En fait, ce problème est résolu directement par la méthode de dénombrement violent .

Tout d'abord, construisez un tableau de marques pour toutes les pièces d'échecs et jugez si les huit directions restantes des mouvements K existants contiennent des échecs en étoile, et si c'est le cas, marquez les échecs en étoile comme visité (les conditions aux limites doivent être prises en compte ici) .

Ensuite, commencez à parcourir les pièces d'échecs de la première ligne et de la première colonne. Si la pièce d'échecs est une pièce d'échecs étoile et n'a pas été visitée, déterminez d'abord si la pièce d'échecs dans le coin inférieur droit est vide. Si elle est vide, vous pouvez poser le pion d'échecs et placer l'étoile d'échecs Marquée comme visitée, la pièce de pion qui est posée en même temps, que ce soit une étoile ou non, sera marquée comme visitée. Si le pion d'échecs ne peut pas être placé dans le coin inférieur droit, alors jugez si le pion d'échecs peut être placé dans le coin inférieur gauche, si possible, marquez l'échec étoile comme visité (il n'est pas nécessaire de marquer le coin supérieur gauche du placé les échecs de pion comme visité, parce que le coin supérieur gauche Les échecs doivent être traversés avant les échecs dans le coin supérieur droit). Dans tout ce jugement, nous devons prêter attention aux limites des conditions aux limites (en général, ce type de problèmes avec les lignes, les colonnes et les tableaux bidimensionnels doit prêter attention aux limites des conditions aux limites). Cet important point doit être reflété dans le code. Out, sinon le code ne sera pas correct.

Dans ce qui précède, pourquoi juger d'abord si l'étoile est placée dans le coin inférieur droit au lieu du coin inférieur gauche? Personnellement, c'est parce qu'en parcourant le jugement, il est jugé du côté droit ...

Enfin, parcourez à nouveau tout le plateau pour voir s'il y a des étoiles. Si tel est le cas, cela signifie qu'il est impossible d'attaquer toutes les étoiles de l'adversaire et de produire -1; sinon, de fournir le nombre d'étoiles à placer.

L'idée de succession de tout le sujet est probablement la suivante. En fait, ce n'est pas facile à penser (je pense que oui, ou parce que le niveau ne suffit pas ...), et il y a beaucoup de petits détails qui doivent être prêté attention au moment où le code est mis en œuvre., Les détails déterminent le succès ou l'échec!

Implémentation de code (C ++)

#include <bits/stdc++.h>
using namespace std;
int vis[1020][1020];
int main()
{
    
    
    int n, c= 0, i, j;
    char a[1020][1020];
    cin >> n;
    for (i = 0; i < n; i++)
    {
    
    
        scanf("%s",a[i]);
    }
    for (i = 0; i < n; i++)
    {
    
    
        for (j = 0; j < n; j++)
        {
    
    
            if (a[i][j] == 'K')
            {
    
    
                for (int k = -1; k <= 1; k++)
                {
    
    
                    for (int m = -1; m <= 1; m++)
                    {
    
    
                        if (i + k >= 0 && i + k < n && j + m >= 0 && j + m < n && a[i + k][j + m] == '*')
                        {
    
    
                            vis[i + k][j + m] = 1;
                        }
                    }
                }
            }
        }
    }
    for (i = 0; i < n; i++)
    {
    
    
        for (j = 0; j < n; j++)
        {
    
    
            if (a[i][j] == '*' && !vis[i][j])
            {
    
    
                if (i + 1 < n && j + 1 < n && a[i + 1][j + 1] == '-')
                {
    
    
                    a[i + 1][j + 1] = 'p';
                    vis[i][j] = 1;
                    c++;
                    if (j + 2 < n)
                    {
    
    
                        vis[i][j + 2] = 1;
                    }
                }
                else if (i + 1 < n && j - 1 >= 0 && a[i + 1][j - 1] == '-')
                {
    
    
                    a[i + 1][j - 1] = 'p';
                    vis[i][j] = 1;
                    c++;
                }
            }
        }
    }
    for (i = 0; i < n; i++)
    {
    
    
        for (j = 0; j < n; j++)
        {
    
    
            if (a[i][j] == '*' && !vis[i][j])
            {
    
    
                cout << "-1" << endl;
                return 0;
            }
        }
    }
    cout << c << endl;
    return 0;
}

Ceci est le premier résumé des vacances d'été. Mon étude est encore un peu lâche, et le calendrier n'est pas assez raisonnable. À l'avenir, je dois faire plus de questions et résumer davantage, aller dans le sens de l'algorithme, allez ! ! !

Je suppose que tu aimes

Origine blog.csdn.net/m0_46772594/article/details/107476139
conseillé
Classement