剪邮票
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.
相关文章推荐
- 电子邮票出售面临着两大困境
- IBM史上最贵广告竟然是一套邮票!
- 邮票 连续整数
- nyoj - 456 邮票分你一半
- poj 1010邮票
- Problem F: [USACO 3.1.6]邮票
- acm-纪念邮票
- 邮票分你一半
- 中国邮票
- soj 1218 纪念邮票
- [NOIP1999提高] CODEVS 1047 邮票面值设计(dfs+dp)
- Halcon 学习总结——邮票目录检测(stamp_catalogue)
- NYOJ 456 邮票分你一半
- NYPJ:邮票分你一半【DP入门】
- 蓝桥杯 剪邮票
- FZU 2227 邮票 (DFS+ 离散化 水题)
- NYOJ 456 邮票分你一半
- (NYoj 325 zb的生日 和 456 邮票分你一半) 两个一样的题目不同的处理方法。(注意看题目中参数的较小值)
- 最小邮票数(C#)
- 第七届蓝桥杯-剪邮票(深搜+广搜)