首页 > 编程语言 >蓝桥杯2016 C/C++程序设计 B组

蓝桥杯2016 C/C++程序设计 B组

时间:2024-08-15 18:24:47浏览次数:16  
标签:10 include int C++ 蓝桥 && ans array 2016

抽签

//X星球要派出一个5人组成的观察团前往W星。
//其中:
//A国最多可以派出4人。
//B国最多可以派出2人。
//C国最多可以派出2人。
//....

//那么最终派往W星的观察团会有多少种国别的不同组合呢?

//下面的程序解决了这个问题。
//数组a[] 中既是每个国家可以派出的最多的名额。
//程序执行结果为:
//DEFFF
//CEFFF
//CDFFF
//CDEFF
//CCFFF
//CCEFF
//CCDFF
//CCDEF
//BEFFF
//BDFFF
//BDEFF
//BCFFF
//BCEFF
//BCDFF
//BCDEF
//....
//(以下省略,总共101行)

#include <stdio.h>
#define N 6
#define M 5
#define BUF 1024
int ans = 0;
void f(int a[], int k, int m, char b[])//对应国家最多可排除的人数,对应国家,人数,输出值
{
    int i, j;

    if (k == N) {
        b[M] = 0;
        if (m == 0)
        {
            ans++;
            printf("%d", ans);//检验 
            printf("%s\n", b);
        }
        return;
    }
    for (i = 0; i <= a[k]; i++) {
        for (j = 0; j < i; j++) b[M - m + j] = k + 'A';//对应国家派出j人
        f(a, k + 1, m - j, b); //填空位置
    }
}
int main()
{
    int a[N] = { 4,2,2,1,1,3 };//对应国家最多可排除的人数
    char b[BUF];//输出
    f(a, 0, M, b);
    return 0;
}

//仔细阅读代码,填写划线部分缺少的内容。

//注意:不要填写任何已有内容或说明性文字。

凑算式

//凑算式

//     B      DEF
//A + — + -——— = 10
//     C       GHI

//(如果显示有问题,可以参见【图1.jpg】)

//这个算式中A~I代表1~9的数字,不同的字母代表不同的数字。

//比如:
//6 + 8 / 3 + 952 / 714 就是一种解法,
//5 + 3 / 1 + 972 / 486 是另一种解法。

//这个算式一共有多少种解法?

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

#include<iostream>

using namespace std;

int main()
{
	int ans = 0;
	for (int a = 1; a < 10; a++)
	{
		for (int b = 1; b < 10; b++)
		{
			if (b != a)
			{
				for (int c = 1; c < 10; c++)
				{
					if (c != a && c != b)
					{
						for (int d = 1; d < 10; d++)
						{
							if (d != a && d != b && d != c)
							{
								for (int e = 1; e < 10; e++)
								{
									if (e != a && e != b && e != c && e != d)
									{
										for (int f = 1; f < 10; f++)
										{
											if (f != a && f != b && f != c && f != d && f != e)
											{
												for (int g = 1; g < 10; g++)
												{
													if (g != a && g != b && g != c && g != d && g != e && g != f)
													{
														for (int h = 1; h < 10; h++)
														{
															if (h != a && h != b && h != c && h != d && h != e && h != f && h != g)
															{
																for (int i = 1; i < 10; i++)
																{
																	if (i != a && i != b && i != c && i != d && i != e && i != f && i != g && i != h)
																	{
																		int up = d * 100 + e * 10 + f;
																		int down = g * 100 + h * 10 + i;
																		if (a + (b * down + c * up) / (c * down) == 10 && (b * down + c * up) % (c * down) == 0)//注:1.int型加减乘除有四舍五入 2.多个除式要化为一个除式在作取余是否等零的判断(避免:可用double型计算)
																		{
																			ans++;
																			printf("%d %d %d %d %d\n", a, b, c, up, down);//检验 
																		}
																	}
																}
															}
														}
													}
												}
											}
										}
									}
								}
							}
						}
					}
				}
			}
		}
	}
	printf("%d", ans);
	return 0;
}

方格填数

//如下的10个格子
//  [][][](  0 1 2)
//[][][][](3 4 5 6)
//[][][]  (7 8 9  )

//(如果显示有问题,也可以参看【图1.jpg】)

//填入0~9的数字。要求:连续的两个数字不能相邻。
//(左右、上下、对角都算相邻)

//一共有多少种可能的填数方案?

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

//暴力
//#include<iostream>
//#include <algorithm>

//using namespace std;

//int ans = 0;

//int main()
//{
//	int array[10] = { 0,1,2,3,4,5,6,7,8,9 };
//	do
//	{
//		if (array[0] != array[1] + 1 && array[0] != array[1] - 1 && array[0] != array[5] + 1 && array[0] != array[5] - 1 && array[0] != array[4] + 1 && array[0] != array[4] - 1 && array[0] != array[3] + 1 && array[0] != array[3] - 1)//注1.#include <cmath> abs()取绝对值化简if条件 2.if条件也可用||
//		{
//			if (array[1] != array[2] + 1 && array[1] != array[2] - 1 && array[1] != array[6] + 1 && array[1] != array[6] - 1 && array[1] != array[5] + 1 && array[1] != array[5] - 1 && array[1] != array[4] + 1 && array[1] != array[4] - 1)
//			{
//				if (array[2] != array[6] + 1 && array[2] != array[6] - 1 && array[2] != array[5] + 1 && array[2] != array[5] - 1)
//				{
//					if (array[3] != array[4] + 1 && array[3] != array[4] - 1 && array[3] != array[8] + 1 && array[3] != array[8] - 1 && array[3] != array[7] + 1 && array[3] != array[7] - 1)
//					{
//						if (array[4] != array[5] + 1 && array[4] != array[5] - 1 && array[4] != array[9] + 1 && array[4] != array[9] - 1 && array[4] != array[8] + 1 && array[4] != array[8] - 1 && array[4] != array[7] + 1 && array[4] != array[7] - 1)
//						{
//							if (array[5] != array[6] + 1 && array[5] != array[6] - 1 && array[5] != array[9] + 1 && array[5] != array[9] - 1 && array[5] != array[8] + 1 && array[5] != array[8] - 1)
//							{
//								if (array[6] != array[9] + 1 && array[6] != array[9] - 1)
//								{
//									if (array[7] != array[8] + 1 && array[7] != array[8] - 1)
//									{
//										if (array[8] != array[9] + 1 && array[8] != array[9] - 1)
//										{
//											ans++;
//										}
//									}
//								}
//							}
//						}
//					}
//				}
//			}
//		}
//	} while (next_permutation(array, array + 10));
//	printf("%d", ans);
//	return 0;
//}

//dfs二维数组
#include<iostream>
#include<math.h>
using namespace std;

int a[5][6];
int vis[10];
int ans;

bool check(int i, int j) {    //检查9宫格 
	for (int x = i - 1; x <= i + 1; x++) {
		for (int y = j - 1; y <= j + 1; y++) {
			if (abs(a[x][y] - a[i][j]) == 1)
				return false;
		}
	}
	return true;
}

void dfs(int x, int y) {
	if (x == 3 && y == 4) {   //出口
		ans++;
		return;
	}

	//从0-9抓一个
	for (int i = 0; i < 10; i++) {
		if (vis[i] == 0) {   //i没有被用过 
			a[x][y] = i;  //填数
			if (!check(x, y)) {
				//数不合法,说明两个数是连续的,则退回到刚才那个点,继续寻找,适合的数
				a[x][y] = -10;//复原,用其他数填
				continue;
			}
			vis[i] = 1;    //标记已访问 
			if (y == 4)
				dfs(x + 1, 1);    //换行 
			else
				dfs(x, y + 1);    //继续右边格子 
			{vis[i] = 0;    //回溯 
			a[x][y] = -10; }
		}
	}
}

void init() {       //将5x6的格子先用-10填满 
	for (int i = 0; i < 5; i++) {
		for (int j = 0; j < 6; j++) {
			a[i][j] = -10;
		}
	}
}
int main() {
	init();
	dfs(1, 2);
	cout << ans << endl;
	return 0;
}

剪邮票

                        图1                                           图2                                            图3

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

//请你计算,一共有多少种不同的剪取方法。
//12选5的条件全排列

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

#include<iostream>
#include <algorithm>

using namespace std;

int ans = 0;
int array[12] = { 0,0,0,0,0,0,0,1,1,1,1,1 };//12选5 注:字典序,从所给开始从小到大排序

void dfs(int tailor[3][4], int x, int y)//dfs连通性检测(十字型四向蔓延)
{
	tailor[x][y] = 0;//已经判断过的赋0,避免影响后续的连通性检测
	if (x - 1 >= 0 && tailor[x - 1][y] == 1)
	{
		dfs(tailor, x - 1, y);
	}
	if (x + 1 <= 2 && tailor[x + 1][y] == 1)
	{
		dfs(tailor, x + 1, y);
	}
	if (y - 1 >= 0 && tailor[x][y - 1] == 1)
	{
		dfs(tailor, x, y - 1);
	}
	if (y + 1 <= 3 && tailor[x][y + 1] == 1)
	{
		dfs(tailor, x, y + 1);
	}
}

bool check(int array[])//连通性检测
{
	int tailor[3][4];
	for (int i = 0; i < 3; i++)
	{
		for (int j = 0; j < 4; j++)
		{
			tailor[i][j] = array[i * 4 + j];
		}
	}
	int count = 0;
	for (int i = 0; i < 3; i++)
	{
		for (int j = 0; j < 4; j++)
		{
			if (tailor[i][j] == 1)
			{
				dfs(tailor, i, j);
				count++;
			}
		}
	}
	return count == 1;
}

int main()
{
	do
	{
		if (check(array))
		{
			ans++;
		}
	} while (next_permutation(array, array + 12));//next_permutation对于存在重复数字的数组能保障不重复
	printf("%d", ans);
	return 0;
}

交换瓶子

//有N个瓶子,编号 1 ~N,放在架子上。

//比如有5个瓶子:
//2 1 3 5 4

//要求每次拿起2个瓶子,交换它们的位置。
//经过若干次后,使得瓶子的序号为:
//1 2 3 4 5(看作数组 array[i]=i)

//对于这么简单的情况,显然,至少需要交换2次就可以复位。

//如果瓶子更多呢?你可以通过编程来解决。

//输入格式为两行:
//第一行 : 一个正整数N(N < 10000), 表示瓶子的数目
//第二行:N个正整数,用空格分开,表示瓶子目前的排列情况。

//输出数据为一行一个正整数,表示至少交换多少次,才能完成排序。

//例如,输入:
//5
//3 1 2 5 4

//程序应该输出:
//3

//再例如,输入:
//5
//5 4 3 2 1

//程序应该输出:
//2

//资源约定:
//峰值内存消耗 < 256M
//CPU消耗 < 1000ms

//请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。

//所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。

//注意 : main函数需要返回0
//注意 : 只使用ANSI C / ANSI C++ 标准,不要调用依赖于编译环境或操作系统的特殊函数。
//注意 : 所有依赖的函数必须明确地在源文件中 #include <xxx>, 不能通过工程设置而省略常用头文件。

//提交时,注意选择所期望的编译器类型。

#include<iostream>

using namespace std;

int N;
int ans = 0;
int bottle[10000];

int position(int x)//返回脚标
{
	for (int i = 1; i <= N; i++)
	{
		if (bottle[i] == x)
		{
			return i;
		}
	}
}

void swap(int i, int j)
{
	int t = bottle[i];
	bottle[i] = bottle[j];
	bottle[j] = t;
}

int main()
{
	scanf("%d", &N);
	for (int i = 1; i <= N; i++)
	{
		scanf("%d", &bottle[i]);
	}
	for (int i = 1; i <= N; i++)
	{
		if (bottle[i] == i)
		{
			continue;
		}
		else
		{
			swap(position(i), i);
			ans++;
		}
	}

	printf("%d\n", ans);
	return 0;
}

快速排序

//排序在各种场合经常被用到。
//快速排序是十分常用的高效率的算法。

//其思想是:先选一个“标尺”,
//用它把整个队列过一遍筛子,
//以保证:其左边的元素都不大于它,其右边的元素都不小于它。

//这样,排序问题就被分割为两个子区间。
//再分别对子区间排序就可以了。

//下面的代码是一种实现,请分析并填写划线部分缺少的代码。

#include <stdio.h>

void swap(int a[], int i, int j)
{
    int t = a[i];
    a[i] = a[j];
    a[j] = t;
}

int partition(int a[], int p, int r)//找标尺脚标,将小于标尺的数放到左侧,大于标尺的数放到右侧
{
    int i = p;
    int j = r + 1;
    int x = a[p];//左端点(标尺)
    while (1) {
        while (i < r && a[++i] < x);
        while (a[--j] > x);
        if (i >= j) break;
        swap(a, i, j);
    }
    swap(a,p,j);//填空位置
    return j;
}

void quicksort(int a[], int p, int r)
{
    if (p < r) {//a[0]<a[11]
        int q = partition(a, p, r);
        quicksort(a, p, q - 1);//标尺两边分别作比较
        quicksort(a, q + 1, r);
    }
}

int main()
{
    int i;
    int a[] = { 5,13,6,24,2,8,19,27,6,12,1,17 };
    int N = 12;

    quicksort(a, 0, N - 1);

    for (i = 0; i < N; i++) printf("%d ", a[i]);
    printf("\n");

    return 0;
}


//注意:只填写缺少的内容,不要书写任何题面已有代码或说明性文字。

煤球数目

//有一堆煤球,堆成三角棱锥形。具体:
//第一层放1个,//0+1
//第二层3个(排列成三角形),//0+1+2
//第三层6个(排列成三角形),//0+1+2+3
//第四层10个(排列成三角形),//0+1+2+3+4
//....
//如果一共有100层,共有多少个煤球?

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

#include<iostream>

using namespace std;

int ans = 0;

int sum(int level)
{
	if (level==101)
	{
		return ans;
	}
	for (int i = 0; i <= level; i++)
	{
		ans += i;
	}
	sum(level += 1);
}
int main()
{
	sum(0);
	printf("%d", ans);
	return 0;
}

生日蜡烛

//某君从某年开始每年都举办一次生日party,并且每次都要吹熄与年龄相同根数的蜡烛。

//现在算起来,他一共吹熄了236根蜡烛。

//请问,他从多少岁开始过生日party的?

//请填写他开始过生日party的年龄数。
//注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。

#include<iostream>

using namespace std;

int main()
{
	for (int start = 0; start <= 236; start++)
	{
		for (int end = 0; end <= 236; end++)
		{
			int sum = 0;
			for (int i = start; i < end; i++)
			{
				sum += i;
			}
			if (sum == 236)
			{
				printf("%d %d", start, end);
			}
		}
	}
	return 0;
}

四平方和

//四平方和定理,又称为拉格朗日定理:
//每个正整数都可以表示为至多4个正整数的平方和。
//如果把0包括进去,就正好可以表示为4个数的平方和。

//比如:
//5 = 0 ^ 2 + 0 ^ 2 + 1 ^ 2 + 2 ^ 2
//7 = 1 ^ 2 + 1 ^ 2 + 1 ^ 2 + 2 ^ 2
//( ^ 符号表示乘方的意思)

//对于一个给定的正整数,可能存在多种平方和的表示法。
//要求你对4个数排序:
//0 <= a <= b <= c <= d
//并对所有的可能表示法按 a, b, c, d 为联合主键升序排列,最后输出第一个表示法

//程序输入为一个正整数N(N < 5000000)
//要求输出4个非负整数,按从小到大排序,中间用空格分开

//例如,输入:
//5
//则程序应该输出:
//0 0 1 2
//再例如,输入:
//12
//则程序应该输出:
//0 2 2 2
//再例如,输入:
//773535
//则程序应该输出:
//1 1 267 838

//资源约定:
//峰值内存消耗 < 256M
//CPU消耗 < 3000ms

//请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。

//所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。

#include<iostream>
#include<cmath>

using namespace std;

int N;
int main()
{
	scanf("%d", &N);
	int n = sqrt(N);//#include<cmath> sqrt()取平方
	for (int a = 0; a <= n; a++)
	{
		for (int b = a; b <= n; b++)
		{
			for (int c = b; c <= n; c++)
			{
				for (int d = c; d <= n; d++)
				{
					if (a * a + b * b + c * c + d * d == N)
					{
						printf("%d %d %d %d", a, b, c, d);
						return 0;
					}
				}
			}
		}
	}
}

标签:10,include,int,C++,蓝桥,&&,ans,array,2016
From: https://blog.csdn.net/cha_0409/article/details/141228955

相关文章

  • 【C++】动态内存(二)智能指针
    由于new和delete会造成一定程度的内存泄漏问题,以及内存所有权不清晰,因此引入自动销毁相应内存空间的智能指针。智能指针是抽象数据类型,本身具有析构函数,因此调用之后会自动调用析构函数,在析构函数中会自动调用delete来释放相应内存空间,因此不用手动显式的调用delete。【......
  • 在C/C++中嵌入Lua代码及使用VS Code调试
     Lua在设计之初就是为了嵌入到应用程序中,为这些应用程序提供灵活的扩展和定制功能。Lua的核心是用C语言编写的,所以Lua脚本可以很容易地与C/C++代码进行交互,通过Lua脚本,用户可以在不修改原有C/C++代码的基础上,实现功能的扩展和定制。 在C/C++程序中可以使用Lua来编写一些需......
  • C++标准库 algorithm 堆操作 heap
    算法库-堆操作基本操作make_heap()(1)从一个元素范围创建出一个最大堆(2)将区间内的元素转化为heap.--传比较器push_heap()对heap增加一个元素.将一个元素加入到一个最大堆pop_heap()对heap取出下一个元素.从最大堆中移除最大元素sort_heap()对heap转化为一......
  • C++标准库 iomanip 输入输出操纵符 Manipulator
    输入/输出操纵符输入输出操纵符是C++中用于控制输入输出流格式的一组特殊函数或对象。它们通常用于格式化输出,例如设置宽度、精度、对齐方式等,而不涉及数据的实际读写。功能概述:输入输出操纵符能够控制输出的外观,比如调整对齐方式、设置输出的宽度和精度、控制换行等。使用......
  • 【计算机二级C++】题目与C++知识自检
    @目录公共基础知识计算机基础数据库数据结构树链表排序队列栈C++const与static指针函数重载构造与析构多态、继承、权限数据类型输入输出流模板公共基础知识计算机基础计算机完成一条指令所花费的时间称为指令周期顺序程序不具有并发性下列叙述中正确的是CA.算法的......
  • C/C++ 动态分配:malloc()和free()所涉及的空指针和强制类型转换、与new和delete的对比
    1、动态分配的内涵所谓动态内存分配,是指在程序运行时根据需要分配和释放内存,而不是在编译时确定内存需求。动态分配包括两方面的内涵:在堆上分配内存。对于linux的虚拟内存,可以分成以下5段:文本段、数据段(分初始化和未初始化数据段)、堆和栈。不使用动态分配定义一个变量,这个变......
  • c#和c++数据交互二
    1:新建c++模板,生成类型动态库2:c++里类型点击查看代码classA{public: inta; };typedefstruct{ intup; intdown; charinfos[4]; //LPWSTRinfos;}info,*LPinfo;3:c++声明动态库方法点击查看代码#defineCVAPIextern"C"__declspec(dll......
  • C++:命名空间与输入输出
    目录前言一、命名空间1.1namespace的价值1.2namespace的定义1.3命名空间的使用二、C++输入&输出前言   C++是一种面向对象的计算机程序设计语言,‌它扩展了C语言的功能,‌并引入了面向对象编程的概念,‌如类、‌继承和多态等,C++是以C语言为基础进行了拓展与创新,C......
  • c#和C++数据交互 一CLR篇
    1:配置VC++目录:包含目录:头文件的所在路径,#include时用“”链接器:输入:附加依赖项如果是clr模板,一定要用lib文件,不然会报链接错误2:先建立一个简单的dll模板,实现加法运算点击查看代码NativeCalculate.hclass__declspec(dllexport)NativeCalculate{public: ......
  • C++ 编译过程
    源码——>预处理器.i文件——>编译器.s文件——>汇编器.o文件——>链接器——>执行程序 预处理器:读取代码里#开头的命令,并把他插入到程序文本里,生产已.i为后缀名的文件编译器:把.i 文件生成汇编文件 .s汇编器:把汇编文件生成二进制文件.a 链接器:链......