#include <iostream>
using namespace std;
#include <list>
#include <string>
int main() {
int num;
string cmd;
cin >> num >> cmd;
int winp = 1;
list<int> lst;
for (int i = 1; i <= num; i++) {
lst.push_back(i);
}
auto p = lst.begin();
auto beg = lst.begin();
auto end = lst.begin();
auto lstEnd = lst.end()--;
for (int i = 0; i < 3; i++) {
end++;
}
//cout << "p: " << *p << " beg: " << * beg << " end: " << * end << endl;
for (int i = 0; i < cmd.size(); i++) {
if (cmd[i] == 'U') {
if (*p == *beg && *p != *lst.begin()) {
beg--;
end--;
} else if (*p == *beg && *p == *lst.begin()) {
//cout << "superU" << endl;
for (int j = 0; j < 4; j++) {
beg--;
end--;
}
beg--;
end--;
p--;
}
p--;
} else if (cmd[i] == 'D') {
if (*p == *end && *p != *lstEnd) {
beg++;
end++;
} else if (*p == *end && *p == *lstEnd) {
//cout << "superD" << endl;
for (int j = 0; j < 4; j++) {
beg++;
end++;
}
beg++;
p++;
end++;
}
p++;
}
//cout << "cmd: " << cmd[i] << " p: " << *p << " beg: " << * beg << " end: " << *
// end << endl;
}
for (int i = 0; i < 4 && i < num; i++) {
cout << *beg << " ";
beg++;
}
cout << "\n"
<< *p << endl;
}
C++的STL的list是双向循环链表,但是记住头尾都会遇到一个额外的迭代器可访问的区域,所以跨过边界的时候需要多加/减一次
利用双向循环的特性和头尾指针,可以实现题目所需的功能
最后有样例曲子少于4首的,记得特殊条件也要更改输出
这样的写的好处在于逻辑代码其实是兼容所有情况

京公网安备 11010502036488号