问题
如【图1.jpg】, 有12张连在一起的12生肖的邮票。
现在你要从中剪下5张来,要求必须是连着的。
(仅仅连接一个角不算相连)
比如,【图2.jpg】,【图3.jpg】中,粉红色所示部分就是合格的剪取。
请你计算,一共有多少种不同的剪取方法。
请填写表示方案数目的整数。
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。
思路
1.用5个for循环找出5个不同的数
2.再对5个数中的第一个数进行路径搜索,对第一个数+1,-1,+5,-5,若相加的值==第二个数,满足其中一个说明与第二个数连通,,,依次类推直到第5个数。
- 说明:原数列+1可能到第2行,如4+1,所以对数列进行更改如下
代码
public class Main7 {
static int count = 0;
static int count1 = 0;
static int[] list = {1,2,3,4,
6,7,8,9,
11,12,13,14};
static int[] arr = new int[5];
static int[] add= {1,-1,5,-5};
static boolean[] visit = new boolean[5];
public static void main(String[] args) {
paiLie(list,0);
System.out.println(count);
}
public static void paiLie(int[] list,int start) {
for(int a=0;a<12;a++) {
for(int b=a+1;b<12;b++) {
for(int c=b+1;c<12;c++) {
for(int d=c+1;d<12;d++) {
for(int e=d+1;e<12;e++) {
arr[0] = list[a];
arr[1] = list[b];
arr[2] = list[c];
arr[3] = list[d];
arr[4] = list[e];
for(int i=0; i<5; i++)
visit[i]=false;
visit[0] = true;
judge(arr,0,0);
int flag = 1;
for(int i=0;i<5;i++) {
if(visit[i]==false) {
flag = 0;
break;
}
}
if(flag==1)
count++;
}
}
}
}
}
}
public static void judge(int[] list,int start,int len) {
for(int i=0;i<4;i++) {
int t = list[start]+add[i];
if(t<1||t>14||t==5||t==10) continue;
for(int j=0;j<5;j++) {
if(!visit[j] && t==list[j]) {
visit[j] = true;
judge(list,j,len+1);
}
}
}
}
}