2017蓝桥杯C++A:方格分割(DFS)

四、题目:方格分割
6x6的方格,沿着格子的边线剪开成两部分。
要求这两部分的形状完全相同。
如图:p1.png, p2.png, p3.png 就是可行的分割法。
试计算:
包括这3种分法在内,一共有多少种不同的分割方法。
注意:旋转对称的属于同一种分割法.

在这里插入图片描述

  • 分析思路:
    仔细观察这个图会发现,它是关于中心点各个方向对称的
    用DFS来就解决

在这里插入图片描述
在这里插入图片描述在这里插入图片描述解题的时候以左下方点为原点,用二维数组的方法
代码:

#include<iostream>
using namespace std;

int ans;
int dire[][2]={{-1,0},{1,0},{0,-1},{0,1}}; //代表4个方向,上下左右 
int vis[7][7];  //哪些点已被访问过 
void dfs(int x,int y){
	if(x==0||y==0||x==6||y==6){ //终止出口条件,当走到边缘的时候,符合题意 
		ans++;
		return;
	}
	//当前的点标注为已访问的点
	vis[x][y]=1;
	//对称的点也标注为已访问的点
	vis[6-x][6-y]=1;
	for(int k=0;k<4;k++){
		int nx=x+dire[k][0]; //横坐标的增量 
		int ny=y+dire[k][1];  //纵坐标的增量 
		//新坐标
		if(nx<0||nx>6||ny<0||ny>6)continue; //越界,不符合 
		if(!vis[nx][ny]){ //若新的点未被访问过 
			dfs(nx,ny); //深搜 
		} 
	} 
vis[x][y]=0;
vis[6-x][6-y]=0;  //对称 
}
int main(){
	dfs(3,3);  //初始点 
	cout<<ans/4<<endl;
	return 0;
}

答案:509

在这里插入图片描述

发布了137 篇原创文章 · 获赞 7 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/gl620321/article/details/105232151
今日推荐