蓝桥杯2017-色块分割

2017蓝桥杯省赛-色块分割

题目描述

本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。

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

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

图片描述

图片描述

图片描述

试计算: 包括这 33 种分法在内,一共有多少种不同的分割方法。 注意:旋转对称的属于同一种分割法。

题解

由于要将这张纸平均分成一模一样的两个部分,因此,无论如何这一刀必须得经过中心点(3, 3),因此可由中心点出发开始裁剪,又因为剪出来两个部分是关于点(3, 3)对称的,所以往正方向咔嚓一刀的时候,其对称的点也可以进行反方向的操作

如图,黄色为对称中心,设蓝色箭头为正方向操作,绿色箭头为反方向操作


import java.util.Scanner;
// 1:无需package
// 2: 类名必须Main, 不可修改

public class Main {

	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		// 在此输入您的代码...
		int x = 3, y = 3;
		int[][] arr = new int[7][7];
		arr[x][y] = 1;
		DFS dfs = new DFS();
		dfs.dfs(arr, x, y);
		System.out.println(dfs.total_count_num / 4);
		scan.close();
		return;
	}
}

class DFS {
	public int total_count_num;

	public DFS() {
		total_count_num = 0;
	}

	public void dfs(int[][] arr, int x, int y) {

		if (x == 6 || y == 6 || x == 0 || y == 0) {
			this.total_count_num++;
			return;
		}
		arr[x][y] = 1;
		arr[6 - x][6 - y] = 1;
		// 为了方便debug打印一个数组
//		for (int[] is : arr) {
//			for (int i : is) {
//				System.out.print(i + " ");
//			}
//			System.out.println();
//		}
//		System.out.println();
		if (arr[x - 1][y] == 0) {
			dfs(arr, x - 1, y);
			arr[x - 1][y] = 0;
			arr[7 - x][6 - y] = 0;
		}
		if (arr[x + 1][y] == 0) {
			dfs(arr, x + 1, y);
			arr[x + 1][y] = 0;
			arr[5 - x][6 - y] = 0;
		}
		if (arr[x][y - 1] == 0) {
			dfs(arr, x, y - 1);
			arr[x][y - 1] = 0;
			arr[6 - x][7 - y] = 0;
		}
		if (arr[x][y + 1] == 0) {
			dfs(arr, x, y + 1);
			arr[x][y + 1] = 0;
			arr[6 - x][5 - y] = 0;
		}

	}

}

最终答案: 509

posted @ 2022-01-16 14:00  一节更比六节强  阅读(35)  评论(0)    收藏  举报