第一行一个整数t,表示有t组数据。以下t行,每行一个整数n,表示最初桩1有n个盘子(0<n≤10)。,对于每组输入数据,打印一系列移动序列,每行打印一次移动操作,最后一行打印移动的最少次数。要求如下
时间: 2024-05-25 17:15:42 浏览: 122
:1. 每次移动只能将一个盘子从一个桩移到另一个桩上。
2. 大盘子不能放在小盘子上面。
3. 打印的移动序列按照“起始桩->目标桩”的格式输出,中间用“->”连接。
4. 移动的最少次数在序列之后,单独一行输出。
5. 移动操作按照字典序排列,即先移动1号盘子的操作排在先,先移动2号盘子的操作排在后。
例如,对于输入数据3 2 3 4,输出如下:
1->3
1->2
3->2
1->3
2->1
2->3
1->3
7
2->1
2->3
1->3
3
1->2
1->3
2->3
1->2
3->1
3->2
1->2
4
解释:
对于第一组数据,一共需要移动7次,移动序列为:
1->3
1->2
3->2
1->3
2->1
2->3
1->3
其中第一步移动的是1号盘子,所以在2号盘子之前,按照字典序输出。最后一行输出移动次数7。
对于第二组数据,一共需要移动3次,移动序列为:
2->1
2->3
1->3
其中第一步移动的是2号盘子,所以在1号盘子之后,按照字典序输出。最后一行输出移动次数3。
对于第三组数据,一共需要移动4次,移动序列为:
1->2
1->3
2->3
1->2
3->1
3->2
1->2
其中第一步移动的是1号盘子,所以在3号盘子之前,按照字典序输出。最后一行输出移动次数4。
相关问题
题目描述 给定一个非负整数数组 nums,青蛙最初位于数组的第一个元素(下标为 0),数组中的每个元素表示它在该位置可以跳跃的最大长度,请求出它所能跳跃到的最远下标。 输入格式 第一行一个整数 N,表示数组 nums 的大小 接下来一行 N 个整数,表示数组 nums 输出格式 仅输出一行一个整数,表示青蛙所能跳跃到的最远下标 样例数据 输入 Input1: 5 2 3 1 1 4 Input2: 5 3 2 1 0 4 Input3: 5 1 4 3 3 2 输出 Output1: 4 Output2: 3 Output3: 4
好的,根据你的要求,我知道你想问我一个关于求最远跳跃距离问题的算法。
这是一个经典的贪心算法问题,可以使用贪心策略,每次选取能够跳跃的最远距离的元素,来进行跳跃。假设当前在位置 i,题目要求的是跳跃到最远的位置,因此我们需要遍历 i 到 i+nums[i] 所有的元素,找到能够跳跃到最远距离的元素。
具体实现细节可以参考以下代码:
```
#include <iostream>
#include <vector>
using namespace std;
int main()
{
int n;
cin >> n;
vector<int> nums(n);
for (int i = 0; i < n; i++)
{
cin >> nums[i];
}
int max_pos = 0;
int end = 0;
for (int i = 0; i < n; i++)
{
if (i > end)
break;
max_pos = max(max_pos, i + nums[i]);
if (i == end)
end = max_pos;
}
cout << max_pos << endl;
return 0;
}
```
以上就是算法的具体实现,希望能够帮到你。
小明最初有一个二进制字符串s(可能长度为0),它可以进行0次或多次以下操作: 加0到字符串的一端,将1加到字符串的另一端,比如: 1011可以操作为:110110,或010111 你得到了小明操作完的结果,请问它原本字符串的最短长度是多少? Input 第一行输入一个整数t,代表测试样例 每组测试样例第一行输入一个整数n,代表字符串长度 每组测试样例第二行输入一个长度为n的二进制字符串,代表最后操作完的字符串。 Output 每组测试输出一个整数,代表原始字符串的最短长度。用c++代码
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int main() {
int t;
cin >> t;
while (t--) {
int n;
cin >> n;
string s;
cin >> s;
int left_zeros = 0, right_ones = 0;
for (int i = 0; i < n; i++) {
if (s[i] == '0') {
left_zeros++;
} else {
break;
}
}
for (int i = n - 1; i >= 0; i--) {
if (s[i] == '1') {
right_ones++;
} else {
break;
}
}
int result = max(left_zeros, right_ones);
cout << result << endl;
}
return 0;
}
阅读全文