Con la ayuda del código de hermano mayor
Descripción del problema
Corta 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.
Como se muestra en la figura: p1.png, p2.png, p3.png son métodos de segmentación factibles.
Inserte la descripción de la imagen aquí Inserte la descripción de la imagen aquí Inserte la descripción de la imagen aquí
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.
Por favor, envíe el número entero, no complete ningún contenido adicional o texto explicativo.
ingresar
Sin entrada
salida
Una
pista entera
Utilice printf o cout para generar la respuesta
Ideas
Preguntas típicas de la ruta de búsqueda de DFS.
Si corta el patrón de muestra, encontrará que solo hay dos puntos en el límite y deben pasar por el punto (3,3). Luego, tome (3,3) como punto de partida para una búsqueda profunda.
Si encuentra un punto profundamente, entonces su punto de simetría central es equivalente a la búsqueda. Si se encuentra el límite, entonces su punto de simetría central también está en el límite a lo largo del ya buscado Corta los puntos pasados, luego los
dos gráficos cortados son gráficos simétricos al centro, pero presta atención al resultado final que se dividirá por 4.
Por ejemplo: partimos del punto (3,3) hasta el final hacia la derecha hasta el límite, o hacia la izquierda, o hacia arriba o hacia abajo, los gráficos son los mismos
Código:
#include <stdio.h>
int dx[4]={
1,0,-1,0},dy[4]={
0,1,0,-1}; //四个方向变化坐标 !!用这种方法写更简便 (一维数组)
int cnt=0;
int map[7][7]={
0};//初始化
void DFS(int x,int y)
{
if(x==0||x==6||y==0||y==6)
{
cnt++;
return;
}
for(int i=0;i<4;i++)//四个方向
{
int newx=x+dx[i];
int newy=y+dy[i];
if(map[newx][newy]==0)
{
map[newx][newy]=1;
map[6-newx][6-newy]=1;
DFS(newx,newy);
map[newx][newy]=0; //用过之后赋回初值
map[6-newx][6-newy]=0;
}
}
}
int main()
{
map[3][3]=1;//从中心开始,3,3表示中心的点
DFS(3,3);
printf("%d",cnt/4);//因为旋转对称是一种 上下左右 四个剪法
return 0;
}