zoj2782

题目大意:

给定一序列元素和一系列序列操作,返回结果序列。序列操作定义如下:
开始位置 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;
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值