蓝桥杯剪邮票java_第七届蓝桥杯Java A——剪邮票

如下图, 有12张连在一起的12生肖的邮票。

aec2f3511465710fc45604bf990b9cf4.png

现在你要从中剪下5张来,要求必须是连着的

(仅仅连接一个角不算相连)

比如

a055582e804aafae3f08e3ba739cbc0b.png

1dec1c35c28c2f66b16b88554b05ad21.png

粉红色所示部分就是合格的剪取。

请你计算,一共有多少种不同的剪取方法

这题不能单纯用DFS来做,如果用DFS,是得不到类似"T"型格子的

正确做法是暴力枚举,从12个格子中枚举出5个格子,然后判断这5个格子是否连通,判断连通可以用DFSimport java.util.*;

public class Main {

static boolean[] book = new boolean[13];

static int[] path = new int[5];

static int[][] map = new int[3][4];

static Set set = new HashSet();

static int ans;

public static void main(String[] args) {

dfs(0);

System.out.println(ans);

}

static void dfs(int idx) {

if (idx == 5) {

int[] tmp = Arrays.copyOf(path, 5);

Arrays.sort(tmp);

String str = tmp[0] + "" + tmp[1] + "" + tmp[2] + "" + tmp[3] + "" + tmp[4];

if (!set.contains(str) && check()) {

set.add(str);

System.out.println(str);

ans++;

}

} else {

for (int i = 1; i <= 12; i++) {

if (!book[i]) {

book[i] = true;

path[idx] = i;

dfs(idx + 1);

book[i] = false;

}

}

}

}

static boolean check() {

map = new int[4][5];

for (int i = 1; i <= 3; i++)

for (int j = 1; j <= 4; j++)

for (int t = 0; t < 5; t++)

if ((i - 1) * 4 + j == path[t])

map[i][j] = 1;

// dfs check connected

int cnt = 0;

for (int i = 1; i <= 3; i++)

for (int j = 1; j <= 4; j++)

if (map[i][j] == 1) {

dfs_connect(i, j);

cnt++;

}

return cnt == 1;

}

static void dfs_connect(int i, int j) {

map[i][j] = 0;

if (i + 1 <= 3 && map[i + 1][j] == 1) dfs_connect(i + 1, j);

if (j + 1 <= 4 && map[i][j + 1] == 1) dfs_connect(i, j + 1);

if (i - 1 >= 1 && map[i - 1][j] == 1) dfs_connect(i - 1, j);

if (j - 1 >= 1 && map[i][j - 1] == 1) dfs_connect(i, j - 1);

}

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值