Blue Bridge Cup Daily One Pregunta 1.6 2017 Competencia provincial Grupo A 4. Grid Division [DFS]

Descripción del Título

Corte una cuadrícula de 6x6 en dos partes a lo largo del borde de la cuadrícula. Se requiere que las formas de las dos partes sean exactamente iguales. La figura muestra el método de división factible.  
 
Trate de calcular: Incluyendo estos tres métodos de división, ¿cuántos métodos de división diferentes hay en total? Nota: La simetría rotacional pertenece al mismo método de división. 

Salida

Salida de un número entero para indicar la respuesta 

https://blog.csdn.net/weixin_43914593/article/details/112257103

✬✬✬✬✬¿Cómo asociar DFS desde la cuadrícula dividida? ✬✬✬✬✬

realce:

1. Debido a que la simetría rotacional pertenece al mismo método de división, el resultado obtenido es / 4

2. Según el significado de la pregunta, esta línea de corte debe pasar por el punto central de la gráfica. Una vez que hayamos determinado la mitad de la línea divisoria que llega al límite, podemos dibujar la otra mitad en base a esta mitad de la simetría . (Para que pueda buscar desde el punto central)

3. En el proceso de búsqueda, debe tenerse en cuenta que la mitad de la línea divisoria que buscamos no puede pasar por dos puntos que son simétricos con respecto al centro al mismo tiempo, por lo que al marcar, debe marcar también el punto simétrico. (Vis [x] [y] = verdadero mientras vis [6-x] [6-y] = verdadero)

4. Derecha, izquierda, arriba, abajo, DFS en cuatro direcciones.

int X [] = {0, -1,1,0,0};

int Y [] = {0,0,0, -1,1};

x + = X [i];

y + = Y [i];

errores:

1. Recurrencia en el ciclo for

2. Después de dar un paso, ven y pregunta si has visitado este punto.

for ( int i = 1; i <= 4; i ++) {// cuatro direcciones

        x + = X [i]; y + = Y [i]; // dar un paso

        if (! vis [x] [y]) {// Si no se visita el punto, continuar con la búsqueda

            vis [x] [y] = true ; // El punto actual se marca como visitado

            vis [6 - x] [6 - y] = verdadero ;

            dfs (x, y); // continuar buscando

            vis[6 - x][6 - y] = false;

            vis[x][y] = false;

        }

        x - = X [i]; y - = Y [i];

    }

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<set>
#include<queue>
#include<stack>
#include<map>
using namespace std;
typedef long long ll;
const int maxn = 110000;

int X[]={0,-1,1,0,0};
int Y[]={0,0,0,-1,1};

bool vis[10][10];
int ans=0;

void dfs(int x,int y)
{
    if(x==0||x==6||y==0||y==6)
    {
        ans++;
        return ;
    }
    for(int i=1;i<=4;i++)
    {
        x+=X[i];
        y+=Y[i];
        if(!vis[x][y])
        {
            vis[x][y]=true;
            vis[6-x][6-y]=true;
            dfs(x,y);
            vis[6-x][6-y]=false;
            vis[x][y]=false;
        }
        x-=X[i];
        y-=Y[i];
    }
}

int main()
{
    vis[3][3]=true;
    dfs(3,3);
    cout<<ans/4;
    return 0;
}


 

Supongo que te gusta

Origin blog.csdn.net/qq_43660826/article/details/112982567
Recomendado
Clasificación