W's Cipher

其他人写的分析:

Slyar:题意理解起来比较难,看了10几分钟才明白...大意就是把字符串按字母分成3组,[a-i]一组,[j-r]一组,[s-z]以及其他字符一组,然后给出了3个整数表示每组内的轮换间隔,让你在各组内分别旋转...哎,自己多看看就明白了。

理解了题意这题就没什么难度了,继续练习STL,这次使用了vector,很爽。我的代码注释很详细,算法我就不说了。

 

 

# include <iostream>
# include <vector>
# include <string>

using namespace std;

int main()
{
int k1, k2, k3, i, len1, len2, len3, pos;
vector<int> n1, n2, n3;
string str;
char dign[81];

while (1)
{
cin>>k1>>k2>>k3;
if (k1 + k2 + k3 == 0)
break;
cin >> str;

n1.clear();
n2.clear();
n3.clear();

len1 = len2 = len3 = 0;
//清楚干净, 然后用n1, n2, n3来保存符合的部分的,在原字符串中的下标位置!

for (i=0; i<str.length(); ++i)
{
if (str[i] >= 'a' && str[i] <= 'i')
n1.push_back(i);
else if (str[i] >= 'j' && str[i] <= 'r')
n2.push_back(i);
else
n3.push_back(i);
}

for (i=0; i<n1.size(); ++i)
{
pos = (i + k1) % n1.size();
dign[ n1[pos] ] = str[ n1[i] ]; //把str中的 n1[i] 位置的元素赋给,dign字符串中, n1[pos] 的位置
}
for (i=0; i<n2.size(); ++i)
{
pos = (i + k2) % n2.size();
dign[ n2[pos] ] = str[ n2[i] ];
}
for (i=0; i<n3.size(); ++i)
{
pos = (i + k3) % n3.size();
dign[ n3[pos] ] = str[ n3[i] ];
}
dign[str.length()] = '\0';
cout<<dign<<endl;
}
return 0;
}

 

posted on 2012-02-29 14:45  万里心晴  阅读(250)  评论(0编辑  收藏  举报