剪邮票 蓝桥杯

剪邮票


如图, 有12张连在一起的12生肖的邮票。
现在你要从中剪下5张来,要求必须是连着的。
(仅仅连接一个角不算相连)
比如图中中,粉红色所示部分就是合格的剪取。


请你计算,一共有多少种不同的剪取方法。


请填写表示方案数目的整数。

注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。


思路:暴力选取所有可能五个数的组合,利用深度优先遍历查看这五个数是不是连在一起的。

#include<iostream>
#include<cstring>
using namespace std;
int i1,i2,i4,i3,i5;
int visited[13]= {0},dir[4]= {-4,1,-1,4},cnt=0;
void DFS(int i) {
	if(cnt<5) {
		for(int j=0; j<4; j++) {
			if((i==4||i==8)&&dir[j]==1) {
				continue;
			}
			if((i==5||i==9)&&dir[j]==-1)
				continue;
			int t=i+dir[j];
			if(cnt<5&&t>0&&t<13&&!visited[t]&&(t==i2||t==i3||t==i4||t==i5)) {
				cnt++;
				visited[t]=1;
				DFS(t);
			}

		}
	}
}

int main() {
	int result=0;
	for(i1=1; i1<=12-4; i1++)
		for(i2=i1+1; i2<=12-3; i2++)
			for(i3=i2+1; i3<=12-2; i3++)
				for(i4=i3+1; i4<=12-1; i4++)
					for(i5=i4+1; i5<=12; i5++) {
						memset(visited,0,sizeof(visited));
						cnt=1;
						DFS(i1);
						if(cnt==5)
							result++;
					}
	cout<<result;
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值