蓝桥杯2017-色块分割
2017蓝桥杯省赛-色块分割
题目描述
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。
6x6的方格,沿着格子的边线剪开成两部分。 要求这两部分的形状完全相同。
如下就是三种可行的分割法。
题解
由于要将这张纸平均分成一模一样的两个部分,因此,无论如何这一刀必须得经过中心点(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

浙公网安备 33010602011771号