最开始以为很复杂呢,认真想了一下,就是理清逻辑!不涉及时间空间越界问题~虽然调了好一会儿,但最后还是做出来了~而且是一次过,太难得了!分享一下~
#include <iostream>
#include <string>
using namespace std;
int main()
{
int i,j,m,n,cases=1;
int A[26],B[26],C[26];
while(cin >> m && m)
{
char c;
for(i=0;i<m;i++)
{
cin >> c;
A[i]=c-'A'-i;
}
for(i=0;i<m;i++)
{
cin >> c;
B[i]=c-'A'-i;
}
for(i=0;i<m;i++)
{
cin >> c;
C[i]=c-'A'-i;
}
cin >> n;
if(cases!=1)
cout << endl;
cout << "Enigma " << cases << ":" << endl;
cases++;
while(n--)
{
string str;
cin >> str;
int stepA=0,stepB=0,stepC=0;
for(i=0;i<str.length();i++)
{
for(j=0;j<m;j++)
{
int a=(j+A[((j-stepA)+m)%m]+m)%m;
int b=(a+B[((a-stepB)+m)%m]+m)%m;
int c=(b+C[((b-stepC)+m)%m]+m)%m;
if(c==str[i]-'A')
{
cout << (char)('a'+j);
break;
}
}
stepA++;
if(stepA==m)
{
stepA=0;
stepB++;
if(stepB==m)
{
stepB=0;
stepC++;
if(stepC==m)
stepC=0;
}
}
}
cout << endl;
}
}
}