蜗蜗很喜欢玩一个游戏:一共有三个不透明的杯子,倒扣着在桌面上排成一排,只有中间那个杯子里面有一个小球,然后不断地快速交换杯子的位置(里面的球跟着杯子一起动),最后让别人猜球到底在哪个位置上。现在小蜗蜗想让你帮他完成移动杯子的动作,并悄悄告诉你他只会交换kk次杯子的位置,然后他会将交换哪两个杯子的指令告诉你,最后请你找出球在哪个位置。 输入格式 第一行一个整数kk。 接下来一共kk行。每一行包含两个整数a,ba,b,a,ba,b都在11到33之间并且它们不相等,表示将从左往右的第aa个杯子和从左往右的第bb个杯子交换。 输出格式 输出一个整数,在11到33之间,表示现在球在从左往右的第几个杯子底下。注意,一开始小球在中间那个杯子里,也就是从左往右的第22个杯子。
时间: 2023-02-08 19:24:19 浏览: 470
这道题的思路就是:刚开始球在第二个杯子里,每次交换的时候就把球的位置记录下来。最后输出球最后停留的位置。
你可以使用一个数组来记录球的位置。每次交换的时候,就交换两个杯子的位置,并且把球的位置也同时更新。
举个例子:
假如刚开始球在第二个杯子里,也就是数组的第二个位置,球的位置数组就是:[0, 1, 0]
然后给出交换杯子的指令,交换第一个和第三个,那么杯子的位置数组就变成:[1, 0, 1]
然后再给出交换杯子的指令,交换第二个和第三个,那么杯子的位置数组就变成:[1, 1, 0]
最后输出数组中值为1的位置就是球停留的位置。
代码如下:
```
int k;
cin >> k;
int a[3] = {0, 1, 0}; // 初始化球的位置数组
while (k--) {
int a1, b1;
cin >> a1 >> b1;
// 交换杯子的位置
swap(a[a1 - 1], a[b1 - 1]);
}
// 输出球最后停留的位置
for (int i = 0; i < 3; i++) {
if (a[i] == 1) {
cout << i + 1 << endl;
break;
}
}
```
相关问题
C++蜗蜗有一个 n×n×n 的魔方,魔方中每个 1×1×1 的小空间中都有一个数字。 蜗蜗现在站在这个魔方的正前方,给你这个魔方从最上层往下看,每一层从后往前、从左往右的数字顺序: 例如当 n=2 时, 第一层为: 1 2 3 4 第二层为: 5 6 7 8 第二层每个数字在第一层对应数字的下方。 现在问你从左侧观察这个魔方,它从左往右每一个面上的数字,从上往下,从后往前的数字顺序。 在这个例子中答案应该为: 第一个面: 1 3 5 7 第二个面: 2 4 6 8
这道题可以分为三个步骤:
1. 将魔方翻转到侧面。
2. 从左往右遍历每个面,将每个面上的数字按照从上往下、从后往前的顺序输出。
3. 将魔方翻转回来。
以下是详细的代码实现:
```c++
#include <iostream>
#include <vector>
using namespace std;
int main() {
int n;
cin >> n;
// 初始化魔方
vector<vector<vector<int>>> magic_cube(n, vector<vector<int>>(n, vector<int>(n)));
int num = 1;
for (int k = 0; k < n; k++) {
for (int j = n - 1; j >= 0; j--) {
for (int i = 0; i < n; i++) {
magic_cube[i][j][k] = num++;
}
}
}
// 翻转魔方到侧面
vector<vector<vector<int>>> magic_cube_side(n, vector<vector<int>>(n, vector<int>(n)));
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
for (int k = 0; k < n; k++) {
magic_cube_side[j][n - i - 1][k] = magic_cube[i][j][k];
}
}
}
// 输出每个面上的数字
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
for (int k = 0; k < n; k++) {
if (j == 0) {
cout << magic_cube_side[i][j][k] << " ";
}
}
}
cout << endl;
}
// 翻转魔方回来
vector<vector<vector<int>>> magic_cube_back(n, vector<vector<int>>(n, vector<int>(n)));
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
for (int k = 0; k < n; k++) {
magic_cube_back[i][n - j - 1][k] = magic_cube_side[j][i][k];
}
}
}
return 0;
}
```
注意:这个实现方式中,我们将魔方翻转到了侧面,输出侧面上的数字后,又将魔方翻转回来。实际上,我们也可以将魔方旋转到左侧面或右侧面,然后输出对应的一面即可,不必翻转回去。
小蜗蜗正在执行一个特种任务,在一条笔直的马路上,路牌上标记为 a,b,c 的地方分别有一个分任务需要小蜗蜗去处理,两个任务地点的距离为两地路牌标记的差值。 小蜗蜗是坐着直升飞机去进行任务的,起初他可以任意选择一个地点空降开始任务,代价为 0,然后接下来选择移动到下一个任务地点,花费为两地距离。最后再移动到剩下那个任务地点,花费为最后地点和上一个地点的距离。 问小蜗蜗完成所有任务的最小花费是多少? 输入格式 一行三个整数 a,b,c。 输出格式 一行一个数字,表示答案。 样例输入1 2 8 6 样例输出1 6 样例输入2 30 25 20 样例输出2 10 样例解释 样例 1 : 空降在 8 处,然后依次移动到 6,2 处,总计耗时 (8−6)+(6−2)=6。 样例 2 : 空降在 20 处,然后依次移动到 25,30 处,总计耗时 (25−20)+(30−25)=10。 数据规模 对于所有数据,保证 1≤a,b,c≤100。
我可以回答这个问题。根据题意,小蜗蜗需要完成三个任务,可以选择任意一个地点开始任务,然后按照给定的顺序完成任务。因为任务地点是在一条笔直的马路上,所以小蜗蜗可以直接飞行到任务地点,不需要绕路。因此,小蜗蜗完成所有任务的最小花费就是从任意一个任务地点出发,依次到达另外两个任务地点的距离之和。具体来说,如果我们选择在 a 处开始任务,那么完成所有任务的最小花费就是 (b-a)+(c-b)。如果我们选择在 b 或 c 处开始任务,同样可以得到相同的最小花费。因此,输出结果就是 (b-a)+(c-b) 或者 (c-b)+(b-a)。
阅读全文