DFS之方格分割java

举报
求不脱发 发表于 2022/04/12 20:12:14 2022/04/12
【摘要】 ​​🙊🙊作者主页:🔗求不脱发的博客 📔📔 精选专栏:🔗SSM直击大厂 📋📋 精彩摘要:DFS之方格分割java 💞💞觉得文章还不错的话欢迎大家点赞👍➕收藏⭐️➕评论💬支持博主🤞

​​🙊🙊作者主页:🔗求不脱发的博客

📔📔 精选专栏:🔗SSM直击大厂

📋📋 精彩摘要:DFS之方格分割java

💞💞觉得文章还不错的话欢迎大家点赞👍➕收藏⭐️➕评论💬支持博主🤞

 问题描述

6x6的方格,沿着格子的边线剪开成两部分。 
要求这两部分的形状完全相同。 
试计算: 
一共有多少种不同的分割方法。 
注意:旋转对称的属于同一种分割法。 
请提交该整数,不要填写任何多余的内容或说明文字。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAcXFfNTIzNjAwNjk=,size_20,color_FFFFFF,t_70,g_se,x_16


具体思路

既然要求剪下来的两部分完全相同,那么剪的路线一定通过图的中心点,并且分割线一定关于中心点对称。因此可以以图中的交点为元素,将6*6的方格转换成7*7的网格,从中心点开始对称的向边界dfs深度遍历,即从中心点开始向上下左右标记的同时,对称的位置也要标记。例如(3,3)->(4,3)的同时,(3,3) -> (2,3)也要标记。当遍历到网格的边界即剪完成,然后进行回溯。


代码


public class _方格分割 {
	static int[][] map = new int[7][7];//网格线
	static int[][] v = new int[7][7];//标记当前点是否访问过,即当前位置是否已经剪过
	static int ans = 0;//最终答案
	static int[][] step = { { 1, 0 }, { 0, 1 }, { -1, 0 }, { 0, -1 } };//上下左右坐标变换

	static void dfs(int x, int y) {
		// 首先判断是否到达边界
		if (x == 0 || y == 0 || x == 6 || y == 6) {
			ans++;
			return;
		}
		// 对称标记已经剪过该位置
		v[x][y] = 1;
		v[6 - x][6 - y] = 1;
		// 依次上下左右剪
		for (int i = 0; i < 4; i++) {
			int newx = x + step[i][0];
			int newy = y + step[i][1];
			// 判断当前位置是否剪过并且没有越界
			if (v[newx][newy] == 0 && newx >= 0 && newx <= 6 && newy >= 0 && newy <= 6) {
				dfs(newx, newy);// 向下一步剪
			}
		}
		// 剪完过后记得回溯
		v[x][y] = 0;
		v[6 - x][6 - y] = 0;
	}

	public static void main(String[] args) {
		dfs(3, 3);// 从(3,3)开始中心对称位置剪
		System.out.println(ans / 4);// 因为中心对称剪的话,每条路线可绕中心点旋转一周,因此一条路线重复了4次,所以要将最后结果/4
	}
}


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。