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;
}