一、36进制
题目链接:36进制 - 蓝桥云课 (lanqiao.cn)
题目要求:
对于 16 进制,我们使用字母 A−F 来表示 10 及以上的数字。
如法炮制,一直用到字母 Z,就可以表示 36 进制。
36 进制中,A 表示 10,Z 表示 35,AA 表示370。
你能算出 MANY 表示的数字用 10 进制表示是多少吗?
解题思路:
直接相减*起来就好。
#include<bits/stdc++.h> using namespace std; int main() { int a = 'Y'-'A'+10; int b = 'N'-'A'+10; int c = 10; int d = 'M'-'A'+10; b*=36; c=c*36*36; d=d*36*36*36; int sum=a+b+c+d; cout<<sum; return 0; }
二、交换瓶子
题目链接:交换瓶子 - 蓝桥云课 (lanqiao.cn)
题目要求:
有 N 个瓶子,编号 1 ~ N,放在架子上。
比如有 5 个瓶子:
2 1 3 5 4
要求每次拿起 2 个瓶子,交换它们的位置。
经过若干次后,使得瓶子的序号为:
1 2 3 4 5
对于这么简单的情况,显然,至少需要交换 2 次就可以复位。
如果瓶子更多呢?你可以通过编程来解决。
解题思路:
遇到编号和数字不符合的就交换位置 记录次数
#include<bits/stdc++.h> using namespace std; int a[10005],ans,n; int main() { cin>>n; for(int i=1;i<=n;i++) { cin>>a[i]; } for(int i=1;i<=n;i++) { while(a[i]!=i) { swap(a[i],a[a[i]]); ans++; } } cout<<ans; return 0; }
三、路径之谜
题目链接:路径之谜 - 蓝桥云课 (lanqiao.cn)
题目要求:
小明冒充 X 星球的骑士,进入了一个奇怪的城堡。
城堡里边什么都没有,只有方形石头铺成的地面。
假设城堡地面是 n×n 个方格。如下图所示。
按习俗,骑士要从西北角走到东南角。可以横向或纵向移动,但不能斜着走,也不能跳跃。每走到一个新方格,就要向正北方和正西方各射一箭。(城堡的西墙和北墙内各有 n 个靶子)同一个方格只允许经过一次。但不必走完所有的方格。如果只给出靶子上箭的数目,你能推断出骑士的行走路线吗?有时是可以的,比如上图中的例子。
本题的要求就是已知箭靶数字,求骑士的行走路径(测试数据保证路径唯一)
解题思路:
dsf,要注意的问题是要记录当前走过的步数,要看看步数是否和横或纵坐标的和值相同。走的路径也可能到终点时也消耗不了箭的数量,所以要注意走的步数要和sum值相同。
#include<bits/stdc++.h> using namespace std; const int N = 21; int dx[]= {-1,1,0,0}; int dy[]= {0,0,-1,1}; int n; int top[N],lft[N]; int ans[N]; int sum; bool vis[N][N]; int pre[N][N]; bool pd(int x,int y) { if(!vis[x][y]&&x>=0&&x<n&&y>=0&&y<n&&top[y]>0&&lft[x]>0) { return true; } return false; } void dfs(int x,int y,int s) { ans[s]=x*n+y; if(x==n-1&&y==n-1&&s==sum) { for(int i=1;i<=s;i++) { cout<<ans[i]<<" "; } cout<<endl; return ; } for(int i=0;i<4;i++) { int nx=x+dx[i]; int ny=y+dy[i]; if(pd(nx,ny)) { vis[nx][ny]=1; top[ny]--; lft[nx]--; dfs(nx,ny,s+1); vis[nx][ny]=0; top[ny]++; lft[nx]++; } } } int main() { cin>>n; for(int i=0;i<n;i++) { cin>>top[i]; sum += top[i]; } for(int i=0;i<n;i++) { cin>>lft[i]; } vis[0][0]=1; dfs(0,0,1); return 0; }