poj3078

题意:很难理解,是说一个队列,给出原始队列,并每次把原始队列中位置a的元素挪到b位置,先不考虑其余元素位置。进行了所有操作后,其余元素依次填入队列的空位,并保持前后顺序不变。问操作后的队列。题中说明每个元素只会被挪一次,而且每个要挪到的位置也只会出现一次。

分析:可以直接模拟。我们可以用两个数组,把第一个数组中的元素挪到第二个数组的指定位置,没有挪的依次填入第二个数组即可。

View Code
#include <iostream>
#include
<cstdio>
#include
<cstdlib>
#include
<cstring>
usingnamespace std;

#define maxn 25
#define maxl 20

char name[maxn][maxl];
int n, m;
bool vis[maxn];
int ans[maxn];

int main()
{
//freopen("t.txt", "r", stdin);
int t;
scanf(
"%d", &t);
while (t--)
{
scanf(
"%d%d", &n, &m);
for (int i =1; i <= n; i++)
scanf(
"%s", name[i]);
memset(vis,
0, sizeof(vis));
memset(ans,
-1, sizeof(ans));
for (int i =0; i < m; i++)
{
int a, b;
scanf(
"%d%d", &a, &b);
vis[a]
=true;
ans[b]
= a;
}
int j =1;
for (int i =1; i <= n; i++)
if (ans[i] ==-1)
{
while (vis[j])
j
++;
ans[i]
= j;
vis[j]
=true;
}
printf(
"%s", name[ans[1]]);
for (int i =2; i <= n; i++)
printf(
" %s", name[ans[i]]);
printf(
"\n");
}
return0;
}
posted @ 2011-07-01 21:26  金海峰  阅读(237)  评论(0编辑  收藏  举报