Description
Input
Output
Sample Input
10 4 5 3 7 2 8 1 6 10 9 1 Hello Bob 1995 CERC 0 0
Sample Output
BolHeol b C RCE
解题思路:
读了半天才看懂题意。题目不难,但要静下心去理解。
题目大意是先给一串数字, 再给一串信息。信息中的每一个字符与给的数字相相应,而相应的数字表示的是该字符应该出如今第几个位置。
依据数字调整好字符的位置后相当于编码一次。然后让你求编码k次后的信息是如何的。
这题必需要找出循环的节点。
字符在编码m次后一定会回到原来的位置,这就是一个循环。记录一个循环中每一个点的位置。编码次数会给的非常大。
假设不用循环来做。是会超时的。
注意:这题每组数据输出之间要空一行。
AC代码:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int main()
{
int n, k, a[205], m[205][205], huan[205]; //m记录一个循环中每一个节点。huan记录每一个点多久循环一次
char mes[205], ans[205];
while(scanf("%d", &n) && n)
{
for(int i = 1; i <= n; i++)
scanf("%d", &a[i]);
while(scanf("%d", &k) && k)
{
gets(mes);
for(int i = strlen(mes); i <= n; i++)
mes[i] = ' ';
memset(huan, 0, sizeof(huan));
for(int i = 1; i <= n; i++)
{
int temp, j;
temp = a[i];
j = 1;
m[i][j] = temp;
while(a[temp] != a[i])
{
temp = a[temp];
m[i][++j] = temp; // 记录循环中点的位置
huan[i]++; //仅仅要没有回到原来位置。循环长度加1
}
huan[i]++;
}
for(int i = 1; i <= n; i++)
{
int p, q;
p = k % huan[i]; // 计算循环后的位置
if(p)
q = m[i][p];
else
q = m[i][huan[i]]; //若能整除说明循环到最后一个
ans[q - 1] = mes[i];
}
ans[n] = '\0';
printf("%s\n", ans);
}
printf("\n"); //每组数据之间要空一行
}
return 0;
}
原文:http://www.cnblogs.com/blfbuaa/p/7233605.html