蓝桥杯 方格问题 6x6的方格,沿着格子的边线剪开成两部分。 要求这两部分的形状完全相同

题目: 

6x6的方格,沿着格子的边线剪开成两部分。 要求这两部分的形状完全相同。

如下就是三种可行的分割法。

 

 

核心思想:

画分割线的思想,从方格中心点开始(因为分割线要中心对称,才能使沿分割线剪出来的格子也是中心对称的),向四个方向延伸分割线,延伸到达下一个点后,继续向四个方向延伸分割线线,以此类推,其中向一个方向延伸时,中心对称的另一条线也要延伸,才能达到分割线剪出来的格子中心对称的效果

代码:

package lanqiaobei;

public class fanggefenge {
	static int ans=0;
	public static void dfs(int x,int y,int[][] visit,int[][] direction) {//深度优先遍历
		if(x==0||y==0||x==6||y==6) {//走到头了说明分割线画完了,一种情况完成ans+1
			ans++;
			return;//到头了,回头,走下一个遍历
		}
		visit[x][y]=1;//这个坐标走过了
		visit[6-x][6-y]=1;//使对称
		for(int i=0;i<4;i++) {
			//调整坐标
			int mx=x+direction[i][0];
			int my=y+direction[i][1];
			if(mx<0||mx>6||my<0||my>6) continue;//不符合的情况除掉,不对它进行递归
			if(visit[mx][my]==0)//这个坐标没走过,则进行深度遍历
				dfs(mx, my, visit, direction);
		}
		//回溯,本次的各个方向的遍历完成后,不能对其他遍历产生影响
		visit[x][y]=0;
		visit[6-x][6-y]=0;
	}
	public static void main(String[] args) {
		int[][] direction = {{1,0},{-1,0},{0,1},{0,-1}};//用于依次为向右向左向上向下
		int[][] visit = new int[7][7];//标志数组,标志这个坐标是否走过
		
		for(int i=0;i<7;i++)
			for(int j=0;j<7;j++)
				visit[i][j]=0;//一开始都没走过,赋值0
		dfs(3, 3, visit, direction);//从中心点开始走
		System.out.println("可能的分割法有:"+ans/4+"种");//别忘了除四,中心对称是不算的
	}

}

  • 6
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值