Copa Provincial Puente Azul 2017 B- Grid Division dfs

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

Supongo que te gusta

Origin blog.csdn.net/qq_47874905/article/details/109043706
Recomendado
Clasificación