/*
1036. Crypto Columns数组与下标(二维数组) 简单
题目大意:
给出一种加密方式,把一个字符串按行写成二维形式,再按照给定字符串的字符大小顺序
逐列替输出。给出加密后的字符串,还原本来的字符串。
解题思路:
按照解密规则把输入字符串写在二维数组上,再输出。
*/
#include <iostream>
#include <cstdlib>
#include <string>
using namespace std;
int main(){
string key;
string cText;
char pText[11][11];
int cols;
int rows;
while(1){
cin >> key;
if(key == "THEEND")
break;
cin >> cText;
cols = key.length();
rows = cText.length()/cols;
int a[101];
char temp;
int index;
int count = 0;
/*错误做法:因为扫描key时,i不断往后移动,而前面可能有重复相同的被扔到了后面
例如 ABBACD,你得到的a数组是 032146 而正确的是031246. 因为你扫完
两个A后,此时的i已经移到了i=2(这里是B),而i=1处也有一个B,这样由于
你的条件temp > key[j] 才交换位置,所以导致了i=2排在了i=1的前面
*/
/*
for(int i=0;i<key.length();i++){
temp = key[i];
index = i;
for (int j=0;j<key.length();j++){
if(temp > key[j])
{
temp = key[j];
index = j;
}
}
a[i] = index;
key[index] = 'a';
}
*/
for(int i=0;i<key.length();i++){
if (key[i] == 'a')
continue;
temp = key[i];
index = i;
for (int j=0;j<key.length();j++){
if(key[j]=='a')
continue;
if(temp > key[j])
{
temp = key[j];
index = j;
}
}
a[count++] = index; //重点1:使用count作为计数变量
key[index] = 'a';
i=0; //重点2:置为0十分重要
}
for (int i=0;i<key.length();i++){
int col = a[i];
for(int j=0;j<rows;j++){
pText[j][col] = cText[i*rows+j];
}
}
for (int i=0;i<rows;i++){
for(int j=0;j<key.length();j++){
cout << pText[i][j];
}
}
cout << endl;
}
return 0;
}
1036. Crypto Columns数组与下标(二维数组) 简单
最新推荐文章于 2018-09-14 09:01:03 发布