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