题意:有一堆的乌龟,输出一堆乱序的乌龟,然后输入一个正确的顺序,要求找到一种最小步骤的方法使得第一堆变成第二堆,每一次可以把乌龟移到第一个位置,输出该方法步骤。
思路:从后往前遍历第二个乌龟数组,与第一个乌龟数组比较。每个乌龟都有一个从小到大的编号,由第二个乌龟数组决定。于是变成了两个数字数组的顺序比较。将字符串比较抽象为数字顺序的比较。
11
24
33
45
56
62
题目的第二个样例可以抽象为上面的数组。可以看出,顺序匹配的只有456,就是说需要移动的只有123,而且需要从大到小移动。
输出有个小技巧,见代码。
#include <iostream> #include <string> using namespace std; int main() { freopen("data.txt", "r", stdin); int cases; string tur1[250], tur2[250]; scanf("%d", &cases); while (cases--) { int n; scanf("%d", &n); getchar(); for(int i = 0; i < n; i++) getline(cin, tur1[i], '\n'); for(int i = 0; i < n; i++) getline(cin, tur2[i], '\n'); int n1 = n - 1, n2 = n - 1; for(int i = n1; i >= 0; i--) if(tur1[i] == tur2[n2]) n2--;//通过排除已匹配的字符串 for(int i = n2; i >= 0; i--) cout << tur2[i] << endl;//直接从已排序好的字符串中输出数据 cout << endl; } return 0; }