报错在于 cin >> N; 之后没有 cin.ignore(); 忽略换行符,以至于换行符被输入进btn。
歌曲数大于4就会涉及到一般翻页,最直观的写法就是分成两大类。
但大于4和小于等于4对翻页的处理思路都是相同的,其它部分也一样,所以可以在翻页时再分类处理。
#include <iostream> #include <string> using namespace std; void selectM(int N, string btn){ if(N <= 4){ int stick = 1; for(int i = 0; i < btn.size(); i++){ if(btn[i] == 'U') stick --; if(btn[i] == 'D') stick ++; if(stick < 1) stick = N; if(stick > N) stick = 1; } for(int i = 1; i <= N; i++){ cout << i << ' '; } cout << endl; cout << stick << endl; return; } if(N > 4){ //歌曲总数大于4 int stick = 1; int head = 1, tail = 4; //大小为4的滑动窗口 for(int i = 0; i < btn.size(); i++){ if(btn[i] == 'U') stick --; if(btn[i] == 'D') stick ++; //特殊翻页 if(stick < 1){ stick = N; tail = stick; head = tail - 4 + 1; }else if(stick > N) { stick = 1; head = 1; tail = head + 4 - 1; } //一般翻页 if(stick < head && stick >= 1){ head --; tail --; }else if(stick > tail && stick <= N){ tail ++; head ++; } } for(int i = 0; i < 4; i++){ cout << head + i << ' '; } cout << endl; cout << stick << endl; return; } } int main() { int N; cin >> N; cin.ignore(); string btn; getline(cin, btn); selectM(N, btn); return 0; } // 64 位输出请用 printf("%lld")
#include <iostream> #include <string> using namespace std; void selectM(int N, string btn) { int stick = 1; int head = 1, tail = 4; //大小为4的滑动窗口 for(int i = 0; i < btn.size(); i++) { if(btn[i] == 'U') { stick--; } else if(btn[i] == 'D') { stick++; } // 处理stick超出范围的情况 if(stick < 1) { stick = N; } else if(stick > N) { stick = 1; } // 更新滑动窗口 if(N <= 4) { head = 1; tail = N; } else { if(stick < head) { head = max(1, stick); tail = head + 4 - 1; } else if(stick > tail) { tail = min(N, stick); head = tail - 4 + 1; } } } // 输出当前滑动窗口的歌曲编号 for(int i = head; i <= tail; i++) { cout << i << ' '; } cout << endl; // 输出当前选中的歌曲编号 cout << stick << endl; } int main() { int N; cin >> N; cin.ignore(); // 忽略换行符 string btn; getline(cin, btn); // 正确读取按钮序列 selectM(N, btn); return 0; }