报错在于 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;
}