蓝桥杯训练题No.7

Q1:小明用字母 AA 对应数字 11,BB 对应 22,以此类推,用 ZZ 对应 2626。请问 2019对应的字符串是什么?

#include<bits/stdc++.h>
using namespace std;

int main() {
	string str;
	int n;cin>>n;
	whihle(n) {
		n--;
		int a = n%26;
		str += 'A' + a;
		n /= 26;
	}
	reverse(str.begin(), str.end());
	cout<<str;
	return 0;
}

Q2:把 2019 分解成 3 个各不相同的正整数之和,并且要求每个正整数都不包含数字 2 和 4,一共有多少种不同的分解方法?

//这个小题目有不少东西
#include<bits/stdc++.h> 
using namespace std;
#define int long long 

bool check(int a) {
	while(a) {
		if(a%10 == 2||a%10 == 4) return false;
		a/=10;
	}return true;
}

signed main() {
	int ans = 0;
	for(int i = 1; i <= 2016; i++)	{
		for(int j = i + 1; j <= 2016; j++) {//j保证比 i大 
		    int	k = 2019 - i - j;//没有把 i + j + k = 2019作为判断的条件,而是直接当作换算条件用,减少了循环的嵌套
			if(check(i)&&check(j)&&check(k)&&i<j&&j<k) ans++; //规定好大小既能解决一组数据间重复的问题,用能解决不同组数据重复的问题
		}
	}
	
	cout<<ans;
	return 0;
}

Q3:下图给出了一个迷宫的平面图,其中标记为 11 的为障碍,标记为 00 的为可以通行的地方。
010000
000100
001001
110000
迷宫的入口为左上角,出口为右下角,在迷宫中,只能从一个位置走到这个它的上、下、左、右四个方向之一。对于上面的迷宫,从入口开始,可以按 DRRURRDDDR 的顺序通过迷宫, 一共 1010 步。其中D、U、L、R分别表示向下、向上、向左、向右走。 对于下面这个更复杂的迷宫(3030 行 5050列),请找出一种通过迷宫的方式,其使用的步数最少,在步数最少的前提下,请找出字典序最小的一个作为答案。
(请注意在字典序中 D<L<R<U。)

#include<bits/stadc++.h>
using namespace std;
#define int long long  

#define ROWS 4
#definr COLS 6
string maze[ROWS] = {
	"010000",
	"000100",
	"001001",
	"110000"
}; 
dir[4][2] = {
	{1, 0},
	{0, -1},
	{-1, 0},
	{0, -1}
};string dirs = "RDLU";

struct Node {
	int x, y;
	chat pos;//指代方向 (上一个结点到它的方向) 
};
queue<Node> Q;
int visited[ROWS][COLS];

Node father[ROWS][COLS];记录每个位置[x][y]的父节点,father[x][y].x是上一个结点的x坐标 
Node start, now, next;

int check(int tx, int ty) {//检查移动的点有没有超过边界 
	return (tx >= 0&&<tx < ROWS&&y >= 0&&ty < COLS);
} 

void dfs(int x, int y) {
	if(x == 0&&y == 0) return;//找到入口
	else {
		//此处可逆序输出
		dfs(father[x][y].x, father[x][y].y);
		cout<<father[x][y].pos;//回退时输出路径 (此处可正序输出) 
	} 
} 

signed main() {
	int i ,tx, ty;
	//起点配置
	start.x = 0; start.y = 0; Q.push(start); visited[0][0] = 1; 
	//开始
	while(!Q.empty()) {
		now = Q.front(); Q.pop();
		if(now.x == ROWS - 1&&now.y == COLS - 1) break;
		for(i = 0; i < 4; i++) {
			tx = now.x + dir[i][0]; ty = now.y + dir[i][1];//移动now点 (但此时now的(x,y)没有变)
			if(check(tx, ty)&&!mage[tx][ty]&&visited[tx][ty] == 1) {
				//开始结点下移,将now结点(不是(tx,ty)结点)赋给父结点 
				visited[tx][ty] = 1;
				father[tx][ty].x = now.x;
				father[tx][ty].y = now.y; 
				father[tx][ty].pos = dirs[i];//记载从(x,y)到(tx, ty)的移动方向 
				next.x = tx;  next.y = ty; Q.push(next);//next接收了移动后的坐标 入队 队不为空 
			}	
		}
	} 
	dfs(ROWS - 1, COLS - 1);
	return 0;
}
上一篇:c# – 如果两个应用程序使用不同的端点地址,它们是否可以共享相同的WCF NetTcpBinding端口?


下一篇:linux系统conda环境使用