写了if,else的嵌套,思路延续上题的解法,我也贴了代码。
主要还是靠i,j进行边界控制然后模拟,嵌套里面的if与else主要判断头页与尾页更换时的边界(即i,j代表的每页的1和4条),其他时候,都是连续页只需要判断key(即鼠标)是否到达i,j边界的外面,然后再更改页面的边界(即i,j的数值)。
供各位参考。
#include <iostream>
#include <bits/stdc++.h>
#include <stack>
using namespace std;
int main() {
string com;//命令字符串
int i, j, key, n;//i,j的数值代表处于本页的第1和4条,key是光标所在位置,n为歌曲数
while (cin >> n >> com) {
key = i = 1;//根据题意初始时key为第一条
if (n < 4) j = n;//先判断歌曲数量,n<4则定义下边界j=n,且后续判断中不改变i,j
else j = 4;//n>=4,j初始即为4
int len = com.size();
for (int k = 0; k < len; k++) {//遍历命令字符串
if (com[k] == 'U') { //向上翻即为key数值减小
key--;
if (key < 1) {//光标向上越界,则到达尾页即n-3到n的歌曲页
key = n;
if (n > 4) {//只有歌曲数量>4,才更改i,j,<=4都不更改,只移动key
i = n - 3;
j = n;
}
} else if (key + 1 == i && n > 4) {//n<=4,不更改i,j
i--;
j--;//光标到达i上面一条,则i,j同时向上移动
}
} else if (com[k] == 'D') { //向下翻即为key数值增加
key++;
if (key > n) {//光标向下越界,则到达首页即1到4的歌曲页
key = 1;
if (n > 4) {//只有歌曲数量>4,才更改i,j,<=4都不更改,只移动key
i = 1;
j = 4;
}
} else if (key - 1 == j && n > 4) {//n<=4,不更改i,j
i++;
j++;//光标到达j下面一条,则i,j同时向下移动
}
}
}
while (i <= j) {//i,j为当前光标所在页的第1和4首歌,输出i到j即可
cout << i << " ";
i++;
}
cout << endl;
cout << key << endl;//输出光标所在的歌曲条目
}
}