2015百度之星资格赛1002_列变位法解密


///
作者:tt267
声明:本文遵循以下协议自由转载-非商用-非衍生-保持署名|Creative Commons BY-NC-ND 3.0
转载请注明:http://blog.csdn.net/tt2767/article/details/45967567
///


题目链接:http://bestcoder.hdu.edu.cn/contests/contest_showproblem.php?cid=584&pid=1002

这题好麻烦啊,wa了好几次,开始的时候以为思路错了,换用一维数组存储矩阵去做,结果超时了,后来一想是忽略了正常的没有空的情况 ⊙▂⊙ ,加上之后就AC了。。。


#include
#include
#include
#include
#define INF 999999999
using namespace std;

char cip[100009];

int main()
{
    int Case,key,id=1;
    int j,i,k,space,l,col,row,fly,Count;
    scanf("%d",&Case);
    while(Case--)
    {
        getchar();
        gets(cip);
        scanf("%d",&key);
        printf("Case #%d:\n",id++);

        l = strlen(cip);
        space = l % key; //最后一行的元素个数
        col = l / key + (space?1:0);//原矩阵列数
        //当密匙等于密文长度或等于1时明明什么都没做么。。。。直接输出就好
        if(key == l || key ==1) 
            puts(cip);
        else if(space) //如果存在空位要修改fly值进行输出
        {
            for(i = 0 ; i < col -1 ; i ++)
            {
                fly= col;
                Count = 0;
                for(j = i ; Count != key  ; j += fly)
                {
                    printf("%c",cip[j]);
                    if(Count >=space)
                        fly = col-1;
                    Count++;
                }
            }

            for(j = i ; space-- ; j += col)
            {
                printf("%c",cip[j]);
            }
            puts("");
        }
        else//不存在就正常输出呗
        {
            for(i = 0 ; i < col ;i++)
            {
                for(j = 0 ; j < key ; j++)
                {
                    printf("%c",cip[j*col+i]);
                }
            }
            puts("");
        }
    }
    return 0;
}

你可能感兴趣的:(ACM_矩阵与快速幂,ACM_做过的一些题)