您的位置:首页 > 编程语言 > Java开发

剪邮票

2018-02-01 10:04 120 查看

一、题目

如【图1.jpg】, 有12张连在一起的12生肖的邮票。

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

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

比如,【图2.jpg】,【图3.jpg】中,粉红色所示部分就是合格的剪取。

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

请填写表示方案数目的整数。

注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。







二、分析

要剪下五张邮票,且五张游标是相连的,观察合格的剪取可以发现,它满足以下特性:

1、两个方格在一行,则它们的值相差1

2、两个方格在一列,则它们的值相差4

那么就有了一条思路,先求这五个数的全排列,然后根据特性去搜索满足条件的排列。

三、代码

public class Main {
static int a[] = new int[5];

public static void main(String[] args) {
int count = 0;
// 取这五个数的全排列组合
for (a[0] = 0; a[0] < 12; a[0]++) {
for (a[1] = a[0] + 1; a[1] < 12; a[1]++) {
for (a[2] = a[1] + 1; a[2] < 12; a[2]++) {
for (a[3] = a[2] + 1; a[3] < 12; a[3]++) {
for (a[4] = a[3] + 1; a[4] < 12; a[4]++) {
if (judge()) {
count++;
}
}
}
}
}
}
System.out.println(count);
}

private static boolean judge() {
boolean visit[] = new boolean[5];
dfs(visit, 0);
return visit[0] && visit[1] && visit[2] && visit[3] && visit[4];
}

// 通过dfs判断连通性
private static void dfs(boolean[] visit, int i) {
visit[i] = true;
// 加一减一要在同一行、加四减四要在同一列
for (int j = 0; j < visit.length; j++) {
if (!visit[j] && (a[i] / 4 == a[j] / 4) && (a[i] == a[j] + 1 || a[i] == a[j] - 1)) {
dfs(visit, j);
}
if (!visit[j] && (a[i] % 4 == a[j] % 4) && (a[i] == a[j] + 4 || a[i] == a[j] - 4)) {// 上下
dfs(visit, j);
}
}
}

}


注:代码是从网上找的。

Travel hopefully is a better thing than to arrive,and true success is to labour.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息