剪邮票(蓝桥杯第七届省赛7题)java

问题

如【图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);
				}
					
			}
		}
	}
}

运行结果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值