题目描述
6x6的方格,沿着格子的边线剪开成两部分。要求这两部分的形状完全相同。如图就是可行的分割法。
试计算:包括这3种分法在内,一共有多少种不同的分割方法。注意:旋转对称的属于同一种分割法。
输出
输出一个整数表示答案
https://blog.csdn.net/weixin_43914593/article/details/112257103
✬✬✬✬✬如何从分割方格来联想到DFS呢?✬✬✬✬✬
highlight:
1.由于旋转对称的属于同一种分割法,得到的结果要/4
2.由题意,这一条切割线必定经过图的中心点,那么我们一旦确定了半条到达边界的分割线,就能根据这半条对称画出另外半条。(所以就可以从中心的点往外搜)
3.在搜索过程中需要注意的是,我们搜索出的半条分割线不能同时经过关于中心对称的两个点,所以在标记时,需要将对称的点也标上。(vis[x][y]=true的同时vis[6-x][6-y]=true)
4.向右、向左、向上、向下,四个方向DFS即可。
int X[]={0,-1,1,0,0};
int Y[]={0,0,0,-1,1};
x+=X[i];
y+=Y[i];
mistakes:
1.在for循环里面进行递归
2.走完一步之后再来询问是否访问过这个点
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];
}
#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;
}