首页 > 试题广场 >

MP3光标位置

[编程题]MP3光标位置
  • 热度指数:132849 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解

MP3 Player因为屏幕较小,显示歌曲列表的时候每屏只能显示几首歌曲,用户要通过上下键才能浏览所有的歌曲。为了简化处理,假设每屏只能显示4首歌曲,光标初始的位置为第1首歌。

现在要实现通过上下键控制光标移动来浏览歌曲列表,控制逻辑如下:

  1. 歌曲总数<=4的时候,不需要翻页,只是挪动光标位置。

光标在第一首歌曲上时,按Up键光标挪到最后一首歌曲;光标在最后一首歌曲时,按Down键光标挪到第一首歌曲。

其他情况下用户按Up键,光标挪到上一首歌曲;用户按Down键,光标挪到下一首歌曲。

2. 歌曲总数大于4的时候(以一共有10首歌为例):


特殊翻页:屏幕显示的是第一页(即显示第1 4首)时,光标在第一首歌曲上,用户按Up键后,屏幕要显示最后一页(即显示第7-10首歌),同时光标放到最后一首歌上。同样的,屏幕显示最后一页时,光标在最后一首歌曲上,用户按Down键,屏幕要显示第一页,光标挪到第一首歌上。

一般翻页:屏幕显示的不是第一页时,光标在当前屏幕显示的第一首歌曲时,用户按Up键后,屏幕从当前歌曲的上一首开始显示,光标也挪到上一首歌曲。光标当前屏幕的最后一首歌时的Down键处理也类似。

其他情况,不用翻页,只是挪动光标就行。

数据范围:命令长度,歌曲数量
进阶:时间复杂度:,空间复杂度:

输入描述:

输入说明:
1 输入歌曲数量
2 输入命令 U或者D



输出描述:

输出说明
1 输出当前列表
2 输出当前选中歌曲

示例1

输入

10
UUUU

输出

7 8 9 10
7
#include <stdio.h>
#include <string.h>

int main() {
    int num,pos,cnt;
    char crtl[100]={0};
    scanf("%d",&num);
    scanf("%s",crtl);
    int len = strlen(crtl);
    pos = 1;
    cnt = 1;
    for(int i=0;i<len;i++)
    {
        if(crtl[i]=='U'&& pos==1)
        {
            pos =num;
            cnt=4;
        }
        else if(crtl[i]=='D'&& pos ==num)
        {
            pos=1;
            cnt=1;
        }
        else if(crtl[i]=='D')
        {
            pos++;
            cnt++;
            cnt = cnt > 4?4:cnt;

        }
        else if(crtl[i]=='U')
        {
            pos--;
            cnt--;
            cnt = cnt>0?cnt:1;
        }

    }
    if(num>4)
    {
        if(cnt==1)
        {
            printf("%d %d %d %d",pos,pos+1,pos+2,pos+3);
            printf("\n%d",pos);
        }
        else if(cnt==4)
        {
            printf("%d %d %d %d",pos-3,pos-2,pos-1,pos);
            printf("\n%d",pos);
        }
        else if(cnt==3)
        {
            printf("%d %d %d %d",pos-2,pos-1,pos,pos+1);
            printf("\n%d",pos);
        }
        else if(cnt==2)
        {
            printf("%d %d %d %d",pos-1,pos,pos+1,pos+2);
            printf("\n%d",pos);
        }
    }
    if(num<4)
    {
        for(int i=1;i<=num;i++)
        {
            printf("%d ",i);
        }
        printf("\n%d",pos);
    }


    return 0;
}
发表于 2024-11-23 20:01:44 回复(0)
不知道什么原因,第十八组测试数据过不去!
我甚至用了两种方法相互验证,两种得出的都是上述输出的错误结果
测试数据:
8
UDUUDDDUDUUUDDUDUDUUDUDUUDDDUUDUDDDU

预计输出:
1 2 3 4 
1

实际输出:
7 8 1 2 
1
非指针法:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int Up(int p,int n){
    if (p==1) {
      p=n;
    }else {
      p--;
    }
    return p;
}
int Down(int p,int n){
    if (p==n) {
      p=1;
    }else {
      p++;
    }
    return p;
}
int main() {
    int n;
    scanf("%d",&n);
    char str[101]={'\0'};
    scanf("%s",str);
    int len = strlen(str);
    
    //初始化歌单
    int i;
    
    //初始化表单,屏幕显示头指针尾指针,当前歌指针
    int head,tail,p;
    if (n<=4) {//n<=4显示歌曲1-n,当前歌为1
        head=1;
        tail=n;
        p=1;
    }else {
        head=1;
        tail=4;
        p=1;
    }

    //换歌
    if (n<=4) {
      //只移动当前歌曲指针
      for (i=0; i<len; i++) {
          if (str[i]=='U') {
              Up(p,n);
          }else if (str[i]=='D') {
              Down(p, n);
          }
      }
    }else {
      //移动屏幕移动当前歌曲指针
      for (i=0; i<len; i++) {

          if (str[i]=='U') {
                if (p==head) {
                    head=Up(head, n);
                    tail=Up(tail, n);
                    p=Up(p,n);//移动当前歌曲指针
                }else {
                    p=Up(p,n);//移动当前歌曲指针
                }
          }else if (str[i]=='D') {
                if (p==tail) {
                    head=Down(head, n);
                    tail=Down(tail, n);
                    p=Down(p, n);
                }else {
                    p=Down(p, n);
                }
        
          }
      }
    }
 
    //显示屏幕上的歌曲编号
    if (n<=4) {
        for (i=1; i<=n; i++) {
            printf("%d ",i);
        }
    }else {
        if (head>=n-2&&head<=n){
        //显示屏显示歌曲head-n和0-tail
            for (i=head; i<=n; i++) {
                printf("%d ",i);
            }
            for (i=1; i<=tail; i++) {
                printf("%d ",i);
            }
        }else {
        //显示屏显示歌曲head-tail
            for (i=head; i<=tail;i++) {
                printf("%d ",i);
            }
        }
    }
    printf("\n%d",p);

    return 0;
}
循环双链表法:
#include<stdio.h>
#include<stdlib.h> 
#include<string.h>
typedef struct Node{
	int data ;
	struct Node *next;
	struct Node *pri;
}Node;

Node * up(Node *k){
	k=k->pri;
	return k;
}
Node * down(Node *k){
	k=k->next;
	return k;
}  
Node * createNewNode()
{
	Node * k=(Node *)malloc(sizeof(Node));
	k->next=NULL;
	k->pri=NULL;
	k->data=0;
	return k;
}
int main(){
	int n;
	scanf("%d",&n);
	
	//初始化歌单 
	Node *h=createNewNode();
	h->data=1;
	h->next = h;
	h->pri = h;

	
	int i;
	for(i=1;i<n;i++){
		Node *r=createNewNode();
		r->data=i+1;
		
		
		r->next=h;
		r->pri=h->pri;
		h->pri->next=r;
		h->pri=r;
	}
	
	

	
	//初始化屏幕头尾指针和当前歌曲指针 
	Node *head,*tail,*p;
	head=h;
	tail=head;
	p=h;
	
	if(n<4){
		for(i=1;i<=n;i++){
			tail=tail->next;
		}
	}else{
		for(i=1;i<=4;i++){
			tail=tail->next;
		}
	}
	
	//移动 
	char str[1001]={'\0'};
	scanf("%s",str);
	int len =strlen(str);
	for(i=0;i<len;i++){
		if(str[i]=='U'){
			if(n>4&&p->data==head->data){
				head=up(head);
				tail=up(tail);
			}
			p=up(p);
		}else if(str[i]=='D'){
			if(n>4&&p->data==tail->pri->data){
				head=down(head);
				tail=down(tail);
			}
			p=down(p);
		}
	}

	
	
	//输出屏幕上歌单
	while(head!=tail){
		printf("%d ",head->data);
		head=head->next;
	} 
	printf("\n%d",p->data);
	return 0;
	 
	
}


发表于 2024-04-15 18:57:45 回复(0)
#include <stdio.h>
#include <string.h>

int main()
{
    int n, i;
    int u=1, d=4;                   //顶端数字和底端数字
    int num=1;                      //输出选中歌曲
    char str[100]={0};
    scanf("%d", &n);
    scanf("%s", &str);
    
    if(n>=4)
    {
        for(i=0;i<strlen(str);i++)
        {
        if(str[i]=='U')
        {
            if(num==1)
            {
                num=n;
                u=n-3;
                d=n;
            }
            else if(num==u)
            {
                num--;
                u--;
                d--;
            }
            else num--;
        }
        else if(str[i]=='D')
        {
            if(num==n && num==d)
            {
                num=1;
                u=1;
                d=4;
            }
            else if (num==d)
            {
                num++;
                u++;
                d++;
            }
            else num++;
        }
        }
        printf("%d %d %d %d\n%d",u,u+1,u+2,u+3,num);
    }
    else if(n<4)
    {
        u=1;
        d=n;
        for(i=0;i<strlen(str);i++)
        {
            if(num==1 && str[i]=='U') num=n;
            else if(str[i]=='U') num--;
            else if(num==n && str[i]=='D') num=1;
            else if(str[i]=='D') num++;
        }
        for(i=1;i<=n;i++)
        {
            printf("%d ",i);
        }
        printf("\n%d",num);
    }
    return 0;
}


发表于 2023-11-28 01:27:50 回复(0)
#include <stdio.h>
#include <string.h>

int main() {
    int sum = 0;
    char str[101] = {'\0'};
    while (scanf("%d %s", &sum, str) != EOF) {
        int len = strlen(str);
        int n = 0;
        int tmp = 4<sum?4:sum;
        int flag = 0;
        for(int i = 0;i<len;i++)
        {
            if(str[i] == 'U')
            {
                if(n == 0)
                {
                    flag = sum - tmp;
                    n = sum - 1;
                }
                else
                {
                    if(n == flag)
                    {
                        flag--;
                        n--;
                    }
                    else
                    {
                        n--;
                    }
                }
               
            }
            else
            {
                if(n == sum-1)
                {
                    flag = 0;
                    n = 0;
                }
                else
                {
                    if(n == flag + tmp-1)
                    {
                        n++;
                        flag++;
                    }
                    else
                    {
                        n++;
                    }
                }
               
            }
        }
        for(int i = 0;i<tmp;i++)
        {
            printf("%d ",++flag);
        }
        printf("\n%d\n",++n);
    }
    return 0;
}
发表于 2023-10-18 15:14:47 回复(0)
#include <string.h>
#include <stdio.h>
#include <stdlib.h>

#define N 101

void HandleOnePage(int page[], char s[], int len, int n)
{
    int cur = 1;
    int min = 1;
    int max = n;
    for(int i = 1; i <= n; i++){
        page[i-1] = i;
        printf("%d ", page[i-1]);
    }
    printf("\n");
    for(int i = 0; i < len; i++){
        if(cur == min){
            if(s[i] == 'U') cur = max;
            else cur = min+1 <= max ? min+1 : max;
        }else if(cur == max){
            if(s[i] == 'U') cur = max-1 >= min ? max-1 : min;
            else cur = min;
        }else{
            if(s[i] == 'U') cur--;
            else cur++;
        }
    }
    printf("%d\n", cur);
}

void HandleMoreThanOnePage(int page[], char s[], int len, int n)
{
    int cur = 1;
    int min = 1;
    int max = n;
    for(int i = 1; i <= 4; i++){
        page[i-1] = i;
    }
    for(int i = 0; i < len; i++){
        if(cur == min){
            if(s[i] == 'U') cur = max, page[0] = n-3, page[1] = n-2, page[2] = n-1, page[3] = n;
            else cur = min+1; 
        }else if(cur == max){
            if(s[i] == 'U') cur--;
            else cur = min, page[0] = 1, page[1] = 2, page[2] = 3, page[3] = 4;
        }else{
            if(cur == page[0]){
                if(s[i] == 'U'){
                    cur--;
                    page[0]--, page[1]--, page[2]--, page[3]--;
                }else{
                    cur++;
                }
            }else if(cur == page[3]){
                if(s[i] == 'U'){
                    cur--;
                }else{
                    cur++;
                    page[0]++, page[1]++, page[2]++, page[3]++;
                }
            }else{
                if(s[i] == 'U') cur--;
                else cur++;
            }
        }
    }
    for(int i = 0; i < 4; i++){
        printf("%d ", page[i]);
    }
    printf("\n");
    printf("%d\n", cur);
}

int main()
{
    int n;
    char s[N] = {0};
    scanf("%d", &n);
    scanf("%s", s);
    int page[4] = {0};
    int len = strlen(s);
    if(n <= 4){
        HandleOnePage(page, s, len, n);
    }else{
        HandleMoreThanOnePage(page, s,len, n);
    }
    return 0;
}

发表于 2023-10-11 22:09:15 回复(0)
#include "stdio.h"
#include "stdlib.h"
#include "string.h"

int main()
{
	int num,i,j;
	while (scanf("%d\n", &num) != EOF){
		char cmd[100];
		for (i = 0; ; i ++) {
			scanf("%c", &cmd[i]);
			if (cmd[i] == '\n')
				break;
		}
		int Len = i;
		int Print_len = 0,Pick_num = 0, Print_start = 0;

		if (num <= 4) {
			Pick_num = 1;
			Print_start = 1;
			Print_len = num;
			for (i = 0; i < Len; i++) {
				if (cmd[i] == 'U' || cmd[i] == 'u') {
					if (Pick_num == 1)
						Pick_num = num;
					else
						Pick_num--;
				}
				else if (cmd[i] == 'D' || cmd[i] == 'd') {
					if (Pick_num == num)
						Pick_num = 1;
					else
						Pick_num++;
				}
			}
		}
		else {
			Pick_num = 1;
			Print_start = 1;
			Print_len = 4;
			for (i = 0; i < Len; i++) {
				if (cmd[i] == 'U' || cmd[i] == 'u') {
					if (Pick_num != Print_start)
						Pick_num--;
					else {
						if (Print_start == 1) {
							Print_start = num - 3;
							Pick_num = num;
						}
						else {
							Print_start--;
							Pick_num--;
						}
					}
				}
				else if (cmd[i] == 'D' || cmd[i] == 'd') {
					if (Pick_num != (Print_start + 3))
						Pick_num++;
					else {
						if (Print_start == (num - 3)) {
							Print_start = 1;
							Pick_num = 1;
						}
						else {
							Print_start++;
							Pick_num++;
						}
					}
				}
			}
		}

		for (i = 0; i < Print_len; i++) {
			printf("%d ", Print_start + i);
		}
		printf("\n%d", Pick_num);
	}
}

发表于 2023-09-10 15:04:51 回复(0)
#include<stdlib.h>
#include<stdio.h>
#include<string.h>


typedef struct {
    int from;       //屏幕显示的第1个num
    int num;        //光标所在num
}dis_t;

dis_t dis;

#define SHOW_SIZE      4

void display(dis_t *dis, int n,int direction);

int main(void){

    int n;              //歌曲数量
    char input[101];    //输入命令

    scanf("%d", &n);
    scanf("%s", input);
    

    //根据示例1得知,初始条件是光标在第1首歌的位置
    dis.from = 1;
    dis.num = 1;

    int num = 1;    //光标初始位置在歌曲1
    int i;
    int len = strlen(input);
    for(i=0;i<len;i++){
        if(input[i] == 'U'){
            if(n <= SHOW_SIZE){     //不存在翻页情况
                if(num - 1 > 0){    //到上一曲
                    num--;          
                }else{
                    num = n;        //从1到尾  即  从头到尾
                }
            }else{  //n > SHOW_SIZE

                display(&dis, n, 0);

            }


        }else{  //input[i] == 'D'
            if(n <= SHOW_SIZE){      //不存在翻页情况
                if(num + 1 <= n){    //到下一曲
                    num++;          
                }else{
                    num = 1;        //从尾到1  即  从尾到头
                }
            }else{  //n > SHOW_SIZE

                display(&dis, n, 1);
            }

        }
    }

    if(n>SHOW_SIZE){           //n > SHOW_SIZE
        for(i=0;i<4;i++)
            printf("%d ", dis.from + i);
    
        printf("\r\n%d\r\n", dis.num);

    }else{                      //n <= SHOW_SIZE
        for(i=0;i<n;i++)
            printf("%d ", 1 + i);

        printf("\r\n%d\r\n", num);
    }



    return 0;
}


/*  屏幕显示存在翻页情况时,即 n > SHOW_SIZE
    dis:详见dis_t,表示当前状态
    n:歌曲数量
    direction:0:UP     1:DOWN
*/
void display(dis_t *dis, int n,int direction){

    if(direction == 1){     //向下
        if(dis->num < dis->from + SHOW_SIZE-1){   //屏幕上歌曲列表不变
            dis->num++;
        }else{      //列表下滑一个
            dis->num++;
            dis->from++;
            if(dis->num > n){    //向下到尾部后再向下
                dis->num = 1;
                dis->from = 1;
            }
        }

    }else if(direction == 0){   //向上
        if(dis->num == dis->from){    //屏幕上歌曲列表变化
            dis->num--;
            dis->from--;
            if(dis->num < 1){    //向上到顶部后再向上
                dis->num = n;
                dis->from = n - SHOW_SIZE + 1;
            }
        }else{                          //屏幕上歌曲列表不变
            dis->num--;
        }
    }

}

发表于 2023-03-30 22:55:24 回复(0)
#include <stdio.h>
int main() {
    int n = 0;
    int flag=1; int Step=1;
    scanf("%d",&n);
    char *str=malloc(n);
    scanf("%s",str);
    if(n<=4)
    {
      char *p=str;
      do {
       if(*p=='U'&&Step!=1)
       {
        Step-=1;
       }
       else if(*p=='U'&&Step==1)
       {
        Step=n;
       }
       else if(*p=='D'&&Step!=n)
       {
        Step+=1;
       }
       else if(*p=='D'&&Step==n)
       {
        Step=1;
       }
       p++;
      }while (*p);
      int  a=n; int b=n-1; int c=n-2;int d=n-3;
      if(d>0)printf("%d ",d); 
      if(c>0)printf("%d ",c);
      if(b>0)printf("%d ",b);
      if(a>0)printf("%d\n",a);
      printf("%d",Step);
    }
    else {
    char *p=str;
      int Num[4]={1,2,3,4};
      int count = 0;
      do {
       if(*p=='U'&&Step!=1)
       {
        Step-=1;
        flag-=1;
       if(flag==0)
        {
         flag=1;
        }
       }
       else if(*p=='U'&&Step==1)
       {
        Step=n;
        flag=4;
       }
       else if(*p=='D'&&Step!=n)
       {
        Step+=1;
        flag+=1;
       if(flag==5)
       {
        flag=4;
       }
        
       }
       else if(*p=='D'&&Step==n)
       {
        Step=1;
        flag=1;
       }
      
       p++;
      }while (*p);
      if(flag==4)
      {
        printf("%d %d %d %d\n",Step-3,Step-2,Step-1,Step);
        printf("%d",Step);
      }
      else if(flag==1)
      {
         printf("%d %d %d %d\n",Step,Step+1,Step+2,Step+3);
        printf("%d",Step);
      }
      else if(flag!=1&&flag!=4)
      {
           printf("%d %d %d %d\n",Step-flag+1,Step-flag+2,Step-flag+3,Step-flag+4);
           printf("%d",Step);
      } 
         
    }
    return 0;
}

发表于 2023-03-07 14:45:17 回复(0)
按条件写判断就完事了
#include <stdio.h>

int main(){
    int n;scanf("%d",&n);
    int p,top,low;p=top=1;char t;
    if(n<4){
        low=n;
    }
    else{
        low=4;
    }
    while(scanf("%c",&t)!=EOF){
        if(t=='U'){
            if(p==1){
                p=n;
                if(n<5){
                    top=1;low=n;
                }
                else{
                    top=n-3;low=n;
                }
            }
            else{
                if(p==top){
                    top--;low--;
                }
                p--;
            }
        }
        if(t=='D'){
            if(p==n){
                p=1;
                if(n<5){
                    top=1;low=n;
                }
                else{
                    top=1;low=4;
                }
            }
            else{
                if(p==low){
                    top++;low++;
                }
                p++;
            }
        }
    }
    for(int i=top;i<=low;i++){
        printf("%d ",i);
    }
    printf("\n%d",p);
}


发表于 2022-06-06 19:24:47 回复(0)
#include <stdio.h>
#define    N        100
int main()
{
    int n,i=0,pos=1,j,k,show[4]={1,2,3,4};
    char order[N];
    scanf("%d%s",&n,order);
    if(n<=4)
    {
        for(i=1;i<=n;i++)
            printf("%d ",i);
        i=0;
        while(order[i]!='\0')
        {
            if(pos==1&&order[i]=='U')
                pos=n;
            else if(pos==n&&order[i]=='D')
                pos=1;
            else
            {
                if(order[i]=='U')
                    pos-=1;
                else
                    pos+=1;
            }
            i++;
        }
        printf("\n%d",pos);
    }
    else
    {
        while(order[i]!='\0')
        {
            if(pos==1&&order[i]=='U')
            {
                k=n;
                for(j=3;j>=0;j--)
                {
                    show[j]=k--;
                }
                pos=n;
            }
            else if(pos==n&&order[i]=='D')
            {
                for(j=0;j<=3;j++)
                    show[j]=j+1;
                pos=1;
            }
            else if(order[i]=='U'&&show[0]==pos)
            {
                for(j=0;j<=3;j++)
                    show[j]--;
                pos--;
            }
            else if(order[i]=='D'&&show[3]==pos)
            {
                for(j=0;j<=3;j++)
                    show[j]++;
                pos++;               
            }
            else
            {
                if(order[i]=='U')
                    pos--;
                else
                    pos++;
            }
            i++;
        }
        for(i=0;i<4;i++)
            printf("%d ",show[i]);
        printf("\n%d",pos);
    }
    return 0;
}

发表于 2022-05-02 11:07:38 回复(0)
要注意歌曲少于4的情况,列表输出不是4首
#include <stdio.h>
#include <string.h>

typedef struct {
    int ci;    //current index
    int cl;    //current list's bigin index
    int n;     //number of songs
}MP3;

void move(MP3* m, char c)
{
    if(c == 'U'){
        if(m->ci == 1){        //top & up 
            m->ci = m->n;
            m->cl = (m->n > 4)? m->n-3 : 1;    //pay attention to this
        }else{
            m->ci--;
            if(m->ci < m->cl){    //list roll up
                m->cl--;
            }
        }
    }else if(c == 'D'){
        if(m->ci == m->n){        //bottom & down
            m->ci = 1;
            m->cl = 1;
        }else{
            m->ci++;
            if(m->ci > m->cl + 3){ //list roll down
                m->cl++;
            }
        }
    }
}

void pntlist(MP3* m)
{
    if(m->n <= 4){        //pay attention to this
        for(int i=1; i <= (m->n); i++){
            printf("%d ", i);
        }
        putchar('\n');
    }else{
        printf("%d %d %d %d\n", m->cl, m->cl+1, m->cl+2, m->cl+3);
    }
}

int main(void)
{
    char in[101];
    MP3 mp3;
    
    while(scanf("%d", &mp3.n) == 1){
        mp3.ci = 1;
        mp3.cl = 1;
        scanf("%s", in);
        for(int i=0; i<strlen(in); i++){
            move(&mp3, in[i]);
        }
        pntlist(&mp3);
        printf("%d\n", mp3.ci);
    }

    return 0;
}


发表于 2022-01-12 14:41:18 回复(0)
C 简单易懂
#include <stdio.h>
#include <string.h>

#define STR_LEN 101
#define PAGE_CA 4

void ProcessSongNotBigger4(char *cmd, int n)
{
    int cur = 1;
    int upIdx = 1;
    int downIdx = n;
    
    for (int i = 0; i < strlen(cmd); i++) {
        if (cmd[i] == 'U') {
            if (cur == 1) {
                cur = n;
            } else {
                cur--;
            }
        }
        
        if (cmd[i] == 'D') {
            if (cur == n) {
                cur = 1;
            } else {
                cur++;
            }
        }
    }
    
    for (int i = 1; i <= n; i++) {
        printf("%d ", i);
    }
    printf("\n%d\n", cur);
}

void ProcessSongBigger4(char *cmd, int n)
{
     int cur = 1;
    int upIdx = 1;
    int downIdx = 4;
    
    for (int i = 0; i < strlen(cmd); i++) {
        if (cmd[i] == 'U') {
            if (cur == 1) {
                cur = n;
                upIdx = n - PAGE_CA + 1;
                downIdx = n;
            } else {
                if (cur > upIdx) {
                    cur--;
                } else {
                    cur--;
                    upIdx--;
                    downIdx--;
                }
            }
        }
        
        if (cmd[i] == 'D') {
            if (cur == n) {
                cur = 1;
                upIdx = 1;
                downIdx = 4;
            } else {
                if (cur < downIdx) {
                    cur++;
                } else {
                    cur++;
                    upIdx++;
                    downIdx++;
                }
            }
        }
    }
    
    for (int i = upIdx; i <= downIdx; i++) {
        printf("%d ", i);
    }
    printf("\n%d\n", cur);
}

int main(void)
{
    char cmd[STR_LEN];
    int songNum;
    
    while (scanf("%d%s", &songNum, cmd) != EOF) {
        if (songNum <= 4) {
            ProcessSongNotBigger4(cmd, songNum);
        } else {
            ProcessSongBigger4(cmd, songNum);
        }
    }
}


发表于 2021-11-27 10:15:35 回复(0)
#include<stdio.h>
int main() {
    int num;
    char ZL[50];
    while(scanf("%d\n", &num) && gets(ZL)) {
        int dest = 1;
        int weizhi = 1;
        for (int i = 0; i < strlen(ZL); i++) {
            if(ZL[i] == 'U') {
                if(dest == 1) {
                    dest = num; // 跳转到最后一首
                    weizhi = 4;
                } else {
                    dest-= 1;
                    if(weizhi > 1) {
                        weizhi-= 1;
                    }
                }
            } else if(ZL[i] == 'D') {
                if(dest == num) {
                    dest = 1; // 跳转到第一首
                    weizhi = 1;
                } else {
                    dest+= 1;
                    if(weizhi < 4) {
                        weizhi+= 1;
                    }
                }
            }
        }
        if(num <= 4){ // 只有一页的情况,不需要考虑当前位置
            for(int i = 1; i <= num; i++) {
                printf("%d ", i);
            }
            printf("\n");
            printf("%d\n", dest);
        } else { // 超过一页的情况,需要考虑当前位置
            if(weizhi == 1){
                printf("%d %d %d %d\n", dest, dest+1, dest+2, dest+3);
            } else if(weizhi == 2){
                printf("%d %d %d %d\n", dest-1, dest, dest+1, dest+2);
            } else if(weizhi == 3){
                printf("%d %d %d %d\n", dest-2, dest-1, dest, dest+1);
            } else if(weizhi == 4){
                printf("%d %d %d %d\n", dest-3, dest-2, dest-1, dest);
            }
            printf("%d\n", dest);
        }
    }
}
发表于 2021-08-21 13:53:50 回复(0)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main() {
    int n = 0;
    while (scanf("%d", &n) != EOF) {
        int res[n];
        for (int i = 0; i < n; ++i) {
            res[i] = i + 1;
        }
        char s[1000];
        scanf("%s", &s);
        int len = strlen(s);
        //按部就班来呗,歌曲小于等于4
        if (n < 5) {
            int j = 0;
            for (int c = 0; c < len; ++c) {
                if (s[c] == 'U') {
                    if (j == 0) {
                        j = n - 1;
                    } else {
                        j--;
                    }
                } else {
                    if (j == n - 1) {
                        j = 0;
                    } else {
                        j++;
                    }
                }
            }
            for (int i = 0; i < n; ++i) {
                printf("%d ", res[i]);
            }
            printf("\n");
            printf("%d\n", res[j]);
        } else {//大于4
            int l = 0, r = l + 3;
            int j = 0;
            for (int c = 0; c < len; c++) {
                if (s[c] == 'U') {
                    if (j == 0) {
                        j = n - 1;
                        r = n - 1;
                        l = r - 3;
                    } else {
                        j--;
                        if (j < l) {
                            l--;
                            r--;
                        }
                    }
                } else {
                    if (j == n - 1) {
                        j = 0;
                        l = 0;
                        r = l + 3;
                    } else {
                        j++;
                        if (j > r) {
                            l++;
                            r++;
                        }
                    }
                }
            }
            for (int i = l; i <= r; ++i) {
                printf("%d ", res[i]);
            }
            printf("\n");
            printf("%d\n", res[j]);
        }
    }
    return 0;
}

编辑于 2021-07-25 20:23:38 回复(0)