HDU 1439(Cipher)

题意:给定一个 n 元置换 key,输入一个字符串(长度若小于 n 则用空格补齐),输出经过 k 次置换后的字符串。

方法:首先计算每个位置置换到自身的置换次数,即循环长度;然后用空格补齐字符串;最后用总置换次数对每个位置的循环长度取余,计算每个位置置换到的最终位置即可。

#include <iostream>
#include <cstring>
using namespace std;
const int MAXN = 205;

int key[MAXN], cycle[MAXN]; //置换数组,循环长度数组
char before[MAXN], after[MAXN]; //原字符串,置换后的字符串

int main()
{
	int n;
	while (cin >> n)
	{
		if (n == 0)
			break;

		memset(key, 0, sizeof(key));
		memset(cycle, 0, sizeof(cycle));
		for (int i = 1; i <= n; i++)
		{
			cin >> key[i];
		}
		for (int i = 1; i <= n; i++) //计算每个位置的循环长度
		{
			int num = 1;
			int temp = key[key[i]];
			while (temp != key[i])
			{
				++num;
				temp = key[temp];
			}
			cycle[i] = num;
		}

		int k;
		while (cin >> k)
		{
			if (k == 0)
				break;

			memset(before, 0, sizeof(before));
			memset(after, 0, sizeof(after));
			getchar(); //读取空格

			cin.getline(before + 1, MAXN - 1);
			int len = strlen(before + 1);
			for (int i = len + 1; i <= n; i++) //补齐字符串
			{
				before[i] = ' ';
			}
			before[n + 1] = '\0';

			for (int i = 1; i <= n; i++) //计算每个位置置换到的最终位置
			{
				int pos = i;
				for (int j = 0; j < k % cycle[i]; j++)
				{
					pos = key[pos];
				}
				after[pos] = before[i];
			}
			after[n + 1] = '\0';
			cout << after + 1 << endl;
		}
		cout << endl;
	}
	return 0;
}

继续加油。 

发布了326 篇原创文章 · 获赞 1 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/Intelligence1028/article/details/105325527
hdu
今日推荐