#include <iostream>
#include <cstdlib>
#include <string>
using namespace std;
int main(){
string key;
string cText;
char pText[101][101];
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的前面
/*错误做法:因为扫描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++){
//错误1:添加此语句后会有微妙错误,忽略与开头比较
// 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[i] = index;
key[index] = 'a';
}
*/
for(int i=0;count<=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]) //错误2:A在B前面,但是'A'<'B',注意字符比大小
{
temp = key[j];
index = j;
}
}
//a[index]=i 错误3:应为a[i]=index;
a[count++] = index; //重点1:使用count作为计数变量
key[index] = 'a';
i=0;
}
for (int i=0;i<key.length();i++){
//cols = a[i]; i<cols;错误4:将cols作为循环变量
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
最新推荐文章于 2017-05-30 04:38:39 发布