NYOJ-初学者的烦恼(队列运用)

题目描述

小c才开始学习c语言,让他最烦恼的就是对字符数组的操作。小C的好朋友小E为了激励他,出了这样一个题目:字符串的移动输出。并给他许诺说,如果他能够在有限的时间内编写出这道题目的代码,并顺利通过就请他去吃大餐,于是小C便认真的敲这个题目的代码去了,聪明的你也来练练手吧。

输入

第一行包括一个整数t,代表有t组数据;
每组数据第一行包括一个整数m(1<=m<=50),第二行有m个小写英文字符,第三行包括一个整数n(0<=n<=100),代表字符串向左移动n位。

输出

每组数据输入站一行,即输出移动后的字符串。

样例输入

3
5
asdfk
0
5
asdfk
1
5
asdfk
6

样例输出

asdfk
sdfka
sdfka

分析:本体类似于约瑟夫环问题,其本质还是队列问题,每次队列首元素出列再放回队列尾即可。

#include<stdio.h>
#include<queue>
using namespace std;
typedef long long ll;
ll i,j,k,x,n,t;
const int M=1e2+5;
char str[M],s;
int main()
{
	scanf("%d",&x);//输入测试次数
	while(x--)
	{
		queue<char>q;//定义一个队列
		scanf("%d",&n);
		scanf("%s",str);//输入字符串
		for(i=0;i<n;i++)//将字符串中所有字符,依次放入队列中
		q.push(str[i]);
		scanf("%d",&t);//输入操作次数
		for(i=1;i<=t;i++)//每次将队列首元素弹出再放回队尾
		{
			s=q.front();
			q.pop();
			q.push(s);
		}
		for(i=0;i<n;i++)//输出时依次将首元素弹出直接输出即可
		{
			s=q.front();
			q.pop();
			printf("%c",s);
		}
		printf("\n");
	}
}

猜你喜欢

转载自blog.csdn.net/basketball616/article/details/86636500