蓝桥杯16年B组真题——剪邮票

【问题描述】

剪邮票

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

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

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

【问题分析】

刚拿到题目时,第一个感觉就是用DFS,从某一个点出发,利用DFS计算从该点出发走满五个格子的情况数,再将所以情况相加即可得到结果。但是!!!!!!如果DFS的话,无法同时向下或者向右走,也就是每次只能向一个方向走。

我们换一个思路吧!!!就是先在12个格子中选五个,再去判断这五个是否连通。因为数据规模比较小,所以这是完完全全可行的!!!!

现在我们就来分别解决这些问题

问题一:12个中选五个,用0表示不选,1表示选择,对7个0和5个1的所有组合情况,那么每一种组合情况,就能代表在图中选择的邮票情况。可以自己写组合的函数,也可以直接调用next_permutation(),后者当然更加方便,本文中也是直接调用next——permutation()来实现12个选5的操作的

问题二:判断选中的5张邮票是否连通。用DFS来判断是否只有一个连通分量。DFS比较迷,我自己也讲不明白,你们自己慢慢体会。

#include <iostream>
#include <algorithm>
using namespace std;


void dfs(int g[3][4],int i,int j){
	g[i][j]=0;//标记已经访问
	if(i-1>=0&&g[i-1][j]==1)dfs(g,i-1,j);
	if(i+1<=2&&g[i+1][j]==1)dfs(g,i+1,j); 
	if(j-1>=0&&g[i][j-1]==1)dfs(g,i,j-1);
	if(j+1<=3&&g[i][j+1]==1)dfs(g,i,j+1);
}
int main(){
	int a[12]={0,0,0,0,0,0,0,1,1,1,1,1};
	int ans=0;
	do{
		int g[3][4];
		for(int i=0;i<3;i++){
			for(int j=0;j<4;j++){
				if(a[i*4+j]==1){
					g[i][j]=1;
				}else{
					g[i][j]=0;
				}
			}
		}
		//g中有五个格子被标记为1,现在用DFS做连通性检查
		int cnt=0;
		for(int i=0;i<3;i++){
			for(int j=0;j<4;j++){
				if(g[i][j]==1){
					dfs(g,i,j);
					cnt++;
				} 
			}
		} 
		if(cnt==1){
			ans++;
		}
	}while(next_permutation(a,a+12));
	cout<<ans<<endl;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 您好,以下是蓝桥杯2021 Java B组真题的简要介绍: 本次比赛共有两个题目,分别为: 1. 矩阵变换 题目描述:给定一个n行m列的矩阵,以及若干个变换操作,每个操作包括一个字符c和一个整数x,表示对矩阵进行c操作,操作的参数为x。其中,c有三种可能的取值:'R'表示将矩阵向右旋转x次;'C'表示将矩阵的第x列删除;'Q'表示询问矩阵中所有元素的和。请你编写程序,实现对矩阵的变换操作。 2. 数字游戏 题目描述:给定一个长度为n的整数序列a,以及若干个操作,每个操作包括一个字符c和两个整数l、r,表示对序列a的[l,r]区间进行c操作,操作的参数为r-l+1。其中,c有两种可能的取值:'Q'表示询问序列a中[l,r]区间内的最大值;'M'表示将序列a中[l,r]区间内的所有数都除以r-l+1。请你编写程序,实现对序列a的变换操作。 希望对您有所帮助。 ### 回答2: 由于我是AI语言模型,无法亲身参加蓝桥杯竞赛,但我可以根据题目描述,给出我对该竞赛的一些看法和建议。 首先,蓝桥杯竞赛是国内比较有影响力的计算机科学竞赛之一,每都会吸引大批对计算机编程感兴趣的学生和程序员参加。2021Java B组的竞赛题目分为两道编程题和一道综合题,难度各不相同,考察了Java基础语法、数据结构算法、面向对象设计等知识点。这也反映了竞赛的难度和专业性,需要参赛选手有扎实的基础和丰富的经验。 对于这些题目,我认为要想取得好的成绩,除了要有好的编程技巧和思维能力外,还要多做练习,不断磨炼自己的思维和实现能力。同时,要注意代码的规范和风格,在竞赛中,优秀的代码不仅能提高代码的可读性和易用性,还会让评委对你的印象更好。 此外,我建议参赛选手可以利用竞赛的机会,多交流学习,了解其他选手的思路和做法。竞赛团队也可以组织相关的讨论和活动,分享经验和心得,提高整个团队的竞争力和实战能力。 最后,我相信参加这样的竞赛,不仅可以锻炼自己的实战能力和思维方式,更可以拓宽视野,增长见识,为日后的学习和职业发展打下坚实的基础。希望所有参赛选手都能在比赛中收获胜利,提高自己,成为未来计算机科学领域的佼佼者。 ### 回答3: 蓝桥杯是中国大学生计算机竞赛的著名赛事之一,旨在推广和普及计算机科学和信息技术知识,提高中国大学生计算机应用能力,培养计算机人才,同时也是国内IT领域企业用人的重要参考。 2021蓝桥杯java B组真题是一道关于数据类型和数组的编程题。题目要求编写一个能够分别存储不同数据类型的数组,并提供查询、插入、删除、排序等功能的程序。具体实现可以通过面向对象的方式,创建一个数组类,使用泛型来支持不同类型的数据存储。在查询、插入、删除、排序等方法中,需要调用相应的数组操作方法,实现对不同类型数据的操作。另外,在排序时,可以使用Java自带的排序函数Arrays.sort()。 此外,此题还要求对程序进行单元测试,验证程序的正确性。可以使用JUnit等单元测试框架来编写测试用例,测试程序的正确性和稳定性,确保程序的可靠性。 总的来说,这道题目涵盖了Java语言的面向对象、泛型、数组操作、排序等知识点,考查了编程者的Java语言基础和编程能力,是一道很好的练习题目。在实际开发中,掌握更多的数据类型和数组操作方法是非常重要的,能够提高程序的效率和可靠性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值