版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_36737934/article/details/88749641
题目描述:
剪邮票
如【图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 stub
System.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));
}
}