描述
小Hi和小Ho经常用Playfair密码表加密自己的代码。 密码表是按以下步骤生成的。
1. 随机选择一个只包含大写字母的单词S作为密钥。
2. 将S中的所有字母J替换为字母I。
3. 将S中的字母依次填写进一个5x5的矩阵,按照从上到下、从左到右的顺序填充格子。填充过程中略过已经在密码表中的字母。
4. 将’A’-‘I’, ‘K’-‘Z’(除去J之外的所有大写字母)中没有出现在密码表中的大写字母按照字母表顺序填入矩阵剩余的格子中。
输入
第1行:一行字符串,只包含大写字母,长度不超过200
输出
共5行,每行5个字母,表示密码表。
样例输入
HIHOCODER
样例输出
HIOCD
ERABF
GKLMN
PQSTU
VWXYZ
Solution
#include <iostream>
#include <string>
using namespace std;
int main(void)
{
bool alphabet_exist[26] = { 0 };
char key[5][5];
string word;
cin >> word;
int pos = word.find('J');
while (pos != -1)
{
word.replace(pos, 1, "I");
pos = word.find('J');
}
int len = 0;
for (int i = 0; i < word.length(); i++)
{
if (alphabet_exist[word.at(i) - 65] == 0)
{
key[len / 5][len % 5] = word.at(i);
len++;
alphabet_exist[word.at(i) - 65] = 1;
}
}
for (int k = 65; k< 65 + 27; k++)
{
if (len == 25)
break;
if (k == 'J')
continue;
if (alphabet_exist[k - 65] == 0)
{
key[len / 5][len % 5] = k;
len++;
alphabet_exist[k - 65] = 1;
}
}
for (int i = 0; i< 5; i++)
{
for (int j = 0; j<5; j++)
{
printf("%c", key[i][j]);
}
printf("\n");
}
}