题目大意:
给定一序列元素和一系列序列操作,返回结果序列。序列操作定义如下:
开始位置 to 要求位置
所以如果序列是:Item1 Item2 Item3 Item4 Item5
序列操作:5 to 2
结果序列就是:Item1 Item5 Item2 Item3 Item4
多个序列操作同时进行,比如给定序列:Item1 Item2 Item3 Item4 Item5 Item6 Item7 Item8
下面的序列操作:2 to 6; 6 to 3; 4 to 5; 5 to 2; 7 to 4; 8 to 1
结果序列如下:Item8 Item5 Item6 Item7 Item4 Item2 Item1 Item3
正如你所看见的,序列操作是严格强制的,其他的元素(不被序列操作包含进来)保持他们的顺序,并移动到序列空闲位置。注意没有连个序列操作有相同的开始位置或相同的要求位置。
输入:
第一行x表示case个数。
第二行m,n,表明元素个数和操作个数。
接下来,有m个单词的序列,
接下来的n行,是具体操作。
输出:结果序列。
解题思路:
用flag2数组记录最终序号,flag1作为过渡。
对于输入操作,flag2[requ]=sta,同时,flag1[sta]=1表明已经使用。
接下来,对于flag2中仍为0的元素,从flag1中顺序查找为0的元素,并将元素位置赋值,最后输出即可
代码如下:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
int main()
{
int x,m,n,i,j,sta,requ;
char flag1[25],flag2[25],item[25][10];
scanf("%d",&x);
while(x--)
{
scanf("%d%d",&m,&n);
for(i=1;i<=m;i++)
{
scanf("%s",item[i]);
flag1[i]=flag2[i]=0;
}
for(i=1;i<=n;i++)
{
scanf("%d%d",&sta,&requ);
flag2[requ]=sta;
flag1[sta]=1;
}
for(i=1;i<=m;i++)
{
if(flag2[i]==0)
{
for(j=1;j<=m;j++)
{
if(flag1[j]==0)
{
flag2[i]=j;
flag1[j]=i;
break;
}
}
}
}
printf("%s",item[flag2[1]]);
for(i=2;i<=m;i++)
{
printf(" %s",item[flag2[i]]);
}
if(x)
printf("\n");
}
return 0;
}
425

被折叠的 条评论
为什么被折叠?



