题目链接:http://bestcoder.hdu.edu.cn/contests/contest_showproblem.php?cid=695&pid=1002
列变位法解密
Accepts: 340
Submissions: 1037
Time Limit: 2000/1000 MS (Java/Others)
Memory Limit: 65536/65536 K (Java/Others)
先根据密钥来计算出每一行都满了的情况下有多少列,然后在判断是都每一行都可以填满,如果不能就将就将空的地方赋值为-1。
先一列一列的进行存,在一行一行的进行读出来即可。
详见代码。
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int N=1e5+5;
char ch[N];
int main()
{
int T;
int cas=1;
scanf("%d",&T);
while (T--)
{
getchar();
gets(ch);
//int len=strlen(ch);
int len=0;
while (ch[len]!='\0')
{
len++;
}
int k,kk=0;
scanf("%d",&k);
printf ("Case #%d:\n",cas++);
int ans;//ans用来表示我可以将这串字符串分成几行
if (len%k==0)
ans=len/k;
else
ans=len/k+1;
int f=ans*k;
char Map[ans][k];
memset(Map,0,sizeof(Map));
int b=0;//b用来表示有几个空格
if (len!=f)
b=f-len;
for (int i=0; i<b; i++)
{
Map[ans-1][k-i-1]=-1;
}
for (int i=0; i<k; i++) //i表示有几列
{
for (int j=0; j<ans; j++)//j表示有几行
{
if (Map[j][i]!=-1)
Map[j][i]=ch[kk++];
}
}
for (int i=0; i<ans; i++)
{
for (int j=0; j<k; j++)
{
if (Map[i][j]==-1)
continue;
cout<<Map[i][j];
}
}
cout<<endl;
}
return 0;
}