Del azul del puente verdadero problema de "cuadro de división" _DFS profundidad de la búsqueda (c ++ lograr)

Enlace de arriba: los exámenes del azul del puente, la lista de la compra (una Resolución minutos)


división de cuadrícula

6x6 cuadrados, cortados en dos partes a lo largo del borde de la cuadrícula.
Se requiere la misma forma de las dos partes.
La figura tres siguientes método de división es factible.
Calcular:
incluye estos tres puntos, incluyendo la ley, un número de diferentes total de segmentación.
Nota: una simetría de rotación pertenecen al mismo método división.
Aquí Insertar imagen Descripción
Aquí Insertar imagen Descripción
Aquí Insertar imagen Descripción

Mis pensamientos

  • cuadrados analíticos: cuadrados es el cuadrado de 7 filas 7, dos cuadrados de color rojo-naranja que rodean la comunicación (3,3) simetría. Se ilustra de la siguiente manera.
    Aquí Insertar imagen Descripción
  • Pensando: ¿Cuántas resolución de manera simétrica, se puede utilizar DFS (recorrido en profundidad) + pensamiento recursivo, comenzó a caminar desde el punto central de simetría, una vez que fue a la final. Proceso: primera marca de la corriente de punto y la simetría punto, y luego ir a las cuatro direcciones a lo largo del punto actual, dar el siguiente paso para determinar si el primero ha pasado por legítimo y si, en caso legítimo, ir a la siguiente etapa de continuar para repetir el proceso (recursiva) . Hasta caminaron frontera. Tenga en cuenta los siguientes puntos.
  1. El punto no es dar marcha atrás a través del Estado desde el punto de meta, en preparación para la próxima caminata.
  2. Debido a que tanto puede caminar desde el centro de simetría (3,3) a las cuatro direcciones, lo mismo que si camino a pie, la misma simetría presentó después del resultado final de la rotación. Por lo que el resultado final se debe dividir por cuatro.

algoritmo espectáculo

#include <iostream>
using namespace std;
typedef int It;//为方便大范围时修改进行类型定义 

It tag[7][7];//标注被访问的点
It dire[4][2]={{0,1},{0,-1},{-1,0},{1,0}};//定义行走方向,上下左右 
It ans=0;//记录结果,因为(x,y)向四个方向走并标注对称方格,旋转之后沿四个方向走相同步骤其实是同一种对称方式,所以结果应该除以4 
It lenDire = sizeof(dire)/sizeof(dire[0]);//获取方向长度 
 
void dfs(It x,It y)//深度遍历 
{
	if(x==0||y==0||x==6||y==6)//走到边界,表示可以构成对称方格,记录该方式。 
	{
		ans++;
		return; 
	}
	//标注走过点 
	tag[x][y]=1;
	tag[6-x][6-y]=1;
	//改变方向行走
	for(int i =0;i<lenDire;i++)
	{
		int curX = x+dire[i][0];
		int curY = y+dire[i][1];
		//判断当前走向是否合法且未走过
		if(tag[curX][curY]==1||(curX<0||curY<0||curX>6||curY>6))continue; 
		
		dfs(curX,curY);
	} 
	//查找完成后回溯标注点
	tag[x][y]=0;
	tag[6-x][6-y]=0;
}
 
int main()
{
	dfs(3,3); 
	cout<<ans/4<<endl;
	return 0;
}
Publicado 30 artículos originales · ganado elogios 3 · Vistas 2745

Supongo que te gusta

Origin blog.csdn.net/weixin_44077556/article/details/104769408
Recomendado
Clasificación