题目描述:
剪邮票
如【图1.jpg】, 有12张连在一起的12生肖的邮票。
现在你要从中剪下5张来,要求必须是连着的。
(仅仅连接一个角不算相连)
比如,【图2.jpg】,【图3.jpg】中,粉红色所示部分就是合格的剪取。
请你计算,一共有多少种不同的剪取方法。
请填写表示方案数目的整数。
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。
直接上代码:
package wiki.zimo.exam07;public class Demo07 {public static void main(String[] args) {int a[] = new int[12];int count = 0;for (a[0] = 0; a[0] < 2; a[0]++) {for (a[1] = 0; a[1] < 2; a[1]++) {for (a[2] = 0; a[2] < 2; a[2]++) {for (a[3] = 0; a[3] < 2; a[3]++) {for (a[4] = 0; a[4] < 2; a[4]++) {for (a[5] = 0; a[5] < 2; a[5]++) {for (a[6] = 0; a[6] < 2; a[6]++) {for (a[7] = 0; a[7] < 2; a[7]++) {for (a[8] = 0; a[8] < 2; a[8]++) {for (a[9] = 0; a[9] < 2; a[9]++) {for (a[10] = 0; a[10] < 2; a[10]++) {for (a[11] = 0; a[11] < 2; a[11]++) {if (a[0] + a[1] + a[2] + a[3] + a[4] + a[5] + a[6] + a[7] + a[8] + a[9] + a[10] + a[11] == 5) {if (judge(a)) {count++;print(a);}}}}}}}}}}}}}}System.out.println(count);}public static boolean judge(int[] a) {int map[][] = new int[][] {{a[0],a[1],a[2],a[3]},{a[4],a[5],a[6],a[7]},{a[8],a[9],a[10],a[11]}};int count = 0;for (int i = 0; i < map.length; i++) {for (int j = 0; j < map[i].length; j++) {if (map[i][j] == 1) {dfs(map,i,j);count++;}}}return count == 1;}public static void dfs(int[][] map, int i, int j) {map[i][j] = 0;if (i - 1 >= 0 && map[i - 1][j] == 1) {dfs(map, i - 1, j);}if (i + 1 <= map.length - 1 && map[i + 1][j] == 1) {dfs(map, i + 1, j);}if (j - 1 >= 0 && map[i][j - 1] == 1) {dfs(map, i, j - 1);}if (j + 1 <= map[i].length - 1 && map[i][j + 1] == 1) {dfs(map, i, j + 1);}}public static void print(int[] a) {// TODO Auto-generated method stubSystem.out.println(""+a[0]+a[1]+a[2]+a[3]);System.out.println(""+a[4]+a[5]+a[6]+a[7]);System.out.println(""+a[8]+a[9]+a[10]+a[11]);System.out.println();
// System.out.println(Arrays.toString(a));}
}