2015百度之星资格赛1002
题目名称:列变位法解密
题目链接:http://bestcoder.hdu.edu.cn/contests/contest_showproblem.php?cid=584&pid=1002
Problem Description
思路:这是一道模拟题,相当于你把数字写成矩形,然后原文是从左往右读,加密后是从上往下读,可以先解出加密后的行数和列数,然后按题意来解就行了。
代码如下:
#include<cstdio> #include<cstring> #include<iostream> #include<string> #include<algorithm> #include<cmath> #include<set> using namespace std; const int INF=0x3f3f3f3f; char a[100005]; int main() { int n,m,x,y,z,q; scanf("%d",&n); for(int i=1;i<=n;i++) { memset(a,0,sizeof(a)); getchar(); gets(a); int l=strlen(a); scanf("%d",&m); printf("Case #%d:\n",i); if(l%m==0) x=l/m;//原来的列1 5 9 else x=l/m+1; y=l+m-x*m;//超出部分的个数 for(int j=0;j<x;j++) for(int k=0;k<m;k++) { if((k>=y)&&(j==x-1))//那些XX的提前结束 continue; q=(k*x+j)/x; q=q-y; //算出第几行里面有没X,有就减去,没有就为0 if(q<0) q=0; printf("%c",a[k*x+j-q]); } printf("\n"); } return 0; }
本文版权归作者本人所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.