20:反反复复
- 总时间限制:
- 1000ms
- 内存限制:
- 65536kB
- 描述
-
Mo和Larry发明了一种信息加密方法。他们首先决定好列数,然后将信息(只包含字母)从上往下依次填入各列,并在末尾补充一些随机字母使其成为一个完整的字母矩阵。例如,若信息是“There's no place like home on a snowy night”并且有5列,Mo会写成:
t o i o y
h p k n n
e l e a i
r a h s g
e c o n h
s e m o t
n l e w x注意Mo只会填入字母,且全部是小写形式。在这个例子中,Mo用字母“x”填充了信息使之成为一个完整的矩阵,当然他使用任何字母都是可以的。
Mo根据这个矩阵重写信息:首先从左到右写下第一行,然后从右到左写下第二行,再从左到右写下第三行……以此左右交替地从上到下写下各行字母,形成新的字符串。这样,例子中的信息就被加密为:toioynnkpheleaigshareconhtomesnlewx。
你的工作是帮助Larry从加密后的信息中还原出原始信息(包括填充的字母)。
- 输入
- 第一行包含一个整数(范围2到20),表示使用的列数。
第二行是一个长度不超过200的字符串。 - 输出
- 一行,即原始信息。
- 样例输入
-
5 toioynnkpheleaigshareconhtomesnlewx
- 样例输出
-
theresnoplacelikehomeonasnowynightx
- 来源
- East Central North America 2004
-
1 #include<iostream> 2 #include<cstdio> 3 #include<cmath> 4 #include<cstring> 5 using namespace std; 6 char a[1001]; 7 int now=0; 8 char b[101][101]; 9 int main() { 10 int n,m; 11 cin>>n; 12 scanf("%s",&a); 13 int l=strlen(a); 14 int hang=l/n; 15 int i=1; 16 int j=1; 17 int fx=1;// 1右 2左 18 while(i*j!=(hang+1)*n) 19 { 20 if(fx==1) 21 { 22 b[i][j]=a[now]; 23 now++; 24 j++; 25 } 26 else if(fx==2) 27 { 28 b[i][j]=a[now]; 29 now++; 30 j--; 31 } 32 if(j==n+1) 33 { 34 i++; 35 j--; 36 fx=2; 37 } 38 if(j==0&&i!=1) 39 { 40 i++; 41 j++; 42 fx=1; 43 } 44 45 46 } 47 b[i][j]=a[now]; 48 /*for(int i=1;i<=hang;i++) 49 { 50 for(int j=1;j<=n;j++) 51 { 52 b[i][j]=a[now]; 53 now++; 54 } 55 }*/ 56 /*for(int i=1;i<=hang;i++) 57 { 58 for(int j=1;j<=n;j++) 59 cout<<b[i][j]; 60 cout<<endl; 61 }*/ 62 i=1,j=1; 63 int tot=0; 64 while(tot!=hang*n) 65 { 66 tot++; 67 cout<<b[i][j]; 68 i++; 69 if(i==hang) 70 { 71 tot++; 72 cout<<b[i][j]; 73 i=1; 74 j++; 75 } 76 } 77 78 return 0; 79 }