列变位法解密
Time Limit: 2000/1000 MS (Java/Others)
Memory Limit: 65536/65536 K (Java/Others)
分析:
1、开始读完题时,没把题目看仔细,写了一个由明文转化为密文的程序,验证样例时,还以为题目出错了,仔细一看------ORZ。
2、本题要求由密文,写出明文,这样较难些。首先我们要解决输入问题(做题少,没见过世面。。。。。)。开始用gets函数,输入不正确,后来改用了getchar输入,还是不行。最后用getline函数,还是有一点点问题,突然灵机一动,在前面加了一句getchar语句就成功解决了。(原因就是输入完样例个数后有一个结束符,getline就读入进去导致程序无法读入其他字符串。)
3、本题思路:把转换矩阵分成两部分,也就是两个不同的矩形,这样方便转换,其他的就好做了。
4、如果像我这样用二维数组模拟转换过程的话,也要注意开的数组内存大小。所以我这里使用了容器进行存储。
LANGUAGE:C++
CODE:
<span style="font-size:18px;">#include <iostream>
#include <vector>
#include <string>
#include <string.h>
using namespace std;
const int maxn=100005;
string c;
vector<char> ans[maxn];
int n;
int main()
{
int t,cnt=0;
cin>>t;
while(t--){
cnt++;
char tmp;
tmp=getchar();
// cin>>c;
getline(cin,c);
// char tmp,c[100005];
// int num=0;
// while((tmp=getchar())!=EOF){
// c[num++]=tmp;
// }
int len=c.length();
cin>>n;
cout<<"Case #"<<cnt<<':'<<endl;
int res,les=0;
if(len%n==0)
res=len/n;
else{
res=len/n+1;
les=len%n;
}
int i,j=0;
for(i=0;i<len;i++){
if(i&&i%res==0)
j++;
if(j&&j==les)
break;
ans[j].push_back(c[i]);
}
// cout<<i<<endl;
if(i!=len){
for(int k=i;k<len;k++){
if((k-i)&&(k-i)%(res-1)==0)
j++;
ans[j].push_back(c[k]);
}
}
for(int i=0;i<res;i++){
for(int j=0;j<n;j++){
if(les&&i==res-1&&j>=les)
break;
cout<<ans[j][i];
}
}
cout<<endl;
for(int i=0;i<n+100;i++)
ans[i].clear();
}
return 0;
}
</span>