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;
}