第一届蓝桥杯决赛B组C++题解代码

第一题

从4个人中选2个人参加活动,一共有6种选法。

从n个人中选m个人参加活动,一共有多少种选法?下面的函数实现了这个功能。

请仔细分析代码,填写缺少的部分(下划线部分)。

注意:请把填空的答案(仅填空处的答案,不包括题面)存入考生文件夹下对应题号的“解答.txt”中即可。
直接写在题面中不能得分。

// n 个元素中任取 m 个元素,有多少种取法
int f(int n, int m)
{
	if(m>n) return 0;
	if(m==0) return 1;

	return f(n-1,m-1) + f(n-1,m);
}

第二题

如果一个自然数的平方数的尾部仍然为该自然数本身,则称其为自守数。
例如:
5 x 5 = 25
76 x 76 = 5776
625 x 625 = 390625

下面代码的目的是寻找出2千万以内的所有自守数。

注意,2千万的平方已经超出了整数表达的最大范围,所以该程序使用了一个巧妙的方案。
如果我们仔细观察乘法的计算过程,就会发现实际上对乘积的尾数有贡献的环节,从而不用真正计算出整个乘积。

请分析代码并填写缺失的部分。

注意:请把填空的答案(仅填空处的答案,不包括题面)存入考生文件夹下对应题号的“解答.txt”中即可。
直接写在题面中不能得分。

void zishou()
{
	int n;
	for(n=1; n<20 * 1000 * 1000; n++)
	{
		int n2 = n;  
		int m = 0;
		for(;;)
		{
			if(n2==0) 
			{
				printf("%d\n", n);
				break;
			}
			
			int k = n2 % 10;  // 从末尾开始,取出乘数的每位数字
			m += k * n;  // 累计乘积
			if(m%10!=k) break;
			m = m / 10;  // 舍去累计乘积的末位
			n2 = n2/10; ;  
		}
	}
}

第三题

看下面的算式:

□□ x □□ = □□ x □□□

它表示:两个两位数相乘等于一个两位数乘以一个三位数。

如果没有限定条件,这样的例子很多。

但目前的限定是:这9个方块,表示1~9的9个数字,不包含0。
该算式中1至9的每个数字出现且只出现一次!

比如:
46 x 79 = 23 x 158
54 x 69 = 27 x 138
54 x 93 = 27 x 186

请编程,输出所有可能的情况!

注意:左边的两个乘数交换算同一方案,不要重复输出!

要求考生把所有函数写在一个文件中。调试好后,存入与考生文件夹下对应题号的“解答.txt”中即可。
相关的工程文件不要拷入。
对于编程题目,要求选手给出的解答完全符合ANSI C标准,不能使用c++特性;
不能使用诸如绘图、中断调用等硬件相关或操作系统相关的API。

#include<bits/stdc++.h>
using namespace std;
int main()
{
	int a[9] = {1,2,3,4,5,6,7,8,9};
	do{
		if((a[0]*10+a[1])<(a[2]*10+a[3])&&(a[0]*10+a[1])*(a[2]*10+a[3])==(a[4]*10+a[5])*(a[6]*100+a[7]*10+a[8]))
		{
			cout<<a[0]<<a[1]<<" x "<<a[2]<<a[3]<<" = "<<a[4]<<a[5]<<" x "<<a[6]<<a[7]<<a[8]<<endl;
		}
	}while(next_permutation(a,a+9));
	return 0;
}

第四题

题目
魔方可以对它的6个面自由旋转。

我们来操作一个2阶魔方(如图1所示):
为了描述方便,我们为它建立了坐标系。

各个面的初始状态如下:
x轴正向:绿
x轴反向:蓝
y轴正向:红
y轴反向:橙
z轴正向:白
z轴反向:黄

假设我们规定,只能对该魔方进行3种操作。分别标记为:
x 表示在x轴正向做顺时针旋转
y 表示在y轴正向做顺时针旋转
z 表示在z轴正向做顺时针旋转

xyz 则表示顺序执行x,y,z 3个操作

题目的要求是:
用户从键盘输入一个串,表示操作序列。
程序输出:距离我们最近的那个小方块的3个面的颜色。
顺序是:x面,y面,z面。

例如:在初始状态,应该输出:
绿红白

初始状态下,如果用户输入:
x
则应该输出:
绿白橙

初始状态下,如果用户输入:
zyx
则应该输出:
红白绿

请编程实现所述功能。

要求考生把所有函数写在一个文件中。调试好后,存入与考生文件夹下对应题号的“解答.txt”中即可。
相关的工程文件不要拷入。
对于编程题目,要求选手给出的解答完全符合ANSI C标准,不能使用c++特性;
不能使用诸如绘图、中断调用等硬件相关或操作系统相关的API。

思路来自https://blog.csdn.net/mikasa3/article/details/54412153

#include<bits/stdc++.h>
using namespace std;
string squ[6][4];
void transX()
{
	string tem[6][4] = squ;
	squ[0][3] = tem[0][2];
	squ[0][1] = tem[0][3];
	squ[0][2] = tem[0][0];
	squ[0][0] = tem[0][1];
	
	squ[4][1] = tem[3][1];
	squ[4][0] = tem[3][0];
	squ[3][1] = tem[5][2];
	squ[3][0] = tem[5][3];
	squ[5][2] = tem[2][1];
	squ[5][3] = tem[2][0];
	squ[2][0] = tem[4][0];
	squ[2][1] = tem[4][1];	
}
void transY()
{
	string tem[6][4] = squ;
	squ[2][3] = tem[2][2];
	squ[2][1] = tem[2][3];
	squ[2][2] = tem[2][0];
	squ[2][0] = tem[2][1];
	
	squ[4][3] = tem[0][3];
	squ[4][1] = tem[0][1];
	squ[1][1] = tem[4][1];
	squ[1][3] = tem[4][3];
	squ[5][3] = tem[1][3];
	squ[5][1] = tem[1][1];
	squ[0][3] = tem[5][3];
	squ[0][1] = tem[5][1];	
} 
void transZ()
{
	string tem[6][4] = squ;
	squ[4][3] = tem[4][2];
	squ[4][1] = tem[4][3];
	squ[4][2] = tem[4][0];
	squ[4][0] = tem[4][1];
	
	squ[0][2] = tem[2][0];
	squ[0][3] = tem[2][2];
	squ[2][2] = tem[1][0];
	squ[2][0] = tem[1][1];
	squ[1][0] = tem[3][1];
	squ[1][1] = tem[3][3];
	squ[3][3] = tem[0][2];
	squ[3][1] = tem[0][3];	
} 
int main()
{
	
	squ[0][0] = squ[0][1] = squ[0][2] = squ[0][3] = "绿";
	squ[1][0] = squ[1][1] = squ[1][2] = squ[1][3] = "蓝";
	squ[2][0] = squ[2][1] = squ[2][2] = squ[2][3] = "红";
	squ[3][0] = squ[3][1] = squ[3][2] = squ[3][3] = "橙";
	squ[4][0] = squ[4][1] = squ[4][2] = squ[4][3] = "白";
	squ[5][0] = squ[5][1] = squ[5][2] = squ[5][3] = "黄";
	string order;
	cin>>order;
	for(int i = 0;i<order.size();i++)
	{
		if(order[i]=='x')
		{
			transX();
		}
		else if(order[i]=='y')
		{
			transY();
		}
		else
		{
			transZ();
		}
	}
	cout<<squ[0][3]<<squ[2][0]<<squ[4][1]<<endl;
	return 0;
}

第五题

已知平面上若干个点的坐标。

需要求出在所有的组合中,4个点间平均距离的最小值(四舍五入,保留2位小数)。

比如有4个点:a,b,c,d, 则平均距离是指:ab, ac, ad, bc, bd, cd 这6个距离的平均值。

每个点的坐标表示为:横坐标,纵坐标

坐标的取值范围是:1~1000

所有点的坐标记录在in.txt中,请读入该文件,然后计算。

注意:我们测试您的程序的时候,in.txt 可能会很大,比如包含上万条记录。

举例:
如果,in.txt 内的值为:

10 10
20 20
80 50
10 20
20 10

则程序应该输出:
11.38

请编程,读入in.txt文件,计算并输出4个点平均距离的最小值。

要求考生把所有函数写在一个文件中。调试好后,存入与考生文件夹下对应题号的“解答.txt”中即可。
相关的工程文件不要拷入。
对于编程题目,要求选手给出的解答完全符合ANSI C标准,不能使用c++特性;
不能使用诸如绘图、中断调用等硬件相关或操作系统相关的API。

#include<bits/stdc++.h>
using namespace std;
#define MAXN 5
int main()
{
	vector<pair<int,int> > point;
	for(int i = 0;i<MAXN;i++)
	{
		int x,y;
		scanf("%d,%d",&x,&y);
		point.push_back(pair<int,int>(x,y));
		
	}
	double mmin = INT_MAX;
	double ans = 0;
	for(int i = 0;i<MAXN-3;i++)
	{
		for(int j = i+1;j<MAXN-2;j++)
		{
			ans=0;
			ans+=sqrt(pow(point[i].first-point[j].first,2)+pow(point[i].second-point[j].second,2));
			if(ans>=mmin) continue;
			for(int k = j+1;k<MAXN-1;k++)
			{
				ans+=sqrt(pow(point[i].first-point[k].first,2)+pow(point[i].second-point[k].second,2));
				ans+=sqrt(pow(point[j].first-point[k].first,2)+pow(point[j].second-point[k].second,2));
				for(int l = k+1;l<MAXN;l++)
				{
					if(ans>=mmin) break;
					ans+=sqrt(pow(point[i].first-point[l].first,2)+pow(point[i].second-point[l].second,2));
					ans+=sqrt(pow(point[j].first-point[l].first,2)+pow(point[j].second-point[l].second,2));
					ans+=sqrt(pow(point[k].first-point[l].first,2)+pow(point[k].second-point[l].second,2));
					if(ans<mmin) mmin = ans;
					ans-=sqrt(pow(point[i].first-point[l].first,2)+pow(point[i].second-point[l].second,2));
					ans-=sqrt(pow(point[j].first-point[l].first,2)+pow(point[j].second-point[l].second,2));
					ans-=sqrt(pow(point[k].first-point[l].first,2)+pow(point[k].second-point[l].second,2));
				}
				ans-=sqrt(pow(point[i].first-point[k].first,2)+pow(point[i].second-point[k].second,2));
				ans-=sqrt(pow(point[j].first-point[k].first,2)+pow(point[j].second-point[k].second,2));
			}
		}
	}
	
	cout<<setprecision(2)<<fixed<<mmin/6<<endl;
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值