百练3421,noi 25:螺旋加密

3421:螺旋加密

总时间限制: 
1000ms 
内存限制: 
65536kB
描述

Chip和Dale发明了一种文本信息加密技术。他们事先秘密约定好矩阵的行数和列数。接着,将字符按如下方式编码:

1. 所有文本只包含大写字母和空格。

2. 每个字符均赋予一个数值:空格=0,A=1,B=2,……,Y=25,Z=26。

按照下图所示的方式,将每个字符对应数值的5位二进制数依次填入矩阵。最后用0将矩阵补充完整。例如,对于信息“ACM”,行列数均为4时,矩阵将被填充为:


将矩阵中的数字按行连起来形成数字串,完成加密。例子中的信息最终会被加密为:0000110100101100。

输入
一行。首先是两个整数R(1≤R≤20)和C(1≤C≤20),表示行数和列数。之后是一个只包含大写字母和空格的字符串。字符串的长度≤(R*C)/5。R和C之间以及C和字符串之间均用单个空格隔开。
输出
一行,为加密后的二进制串。注意你可能需要用0将矩阵补充完整。
样例输入
4 4 ACM
样例输出
0000110100101100
来源
Greater NY 2007

  • 查看 
  • 提交 
  • 统计 
  • 提示 
  • 提问
    • 代码:
    • #include<cstdio>
      #include<cstring>
      int R,C,cnt = 1;
      char code[27][6] = {"00000","00001","00010","00011","00100",
          "00101","00110","00111","01000","01001","01010","01011",
          "01100","01101","01110","01111","10000","10001","10010",
          "10011","10100","10101","10110","10111","11000","11001","11010"
      };
      char str[100],ctr[410],a[25][25];
      int main(){
          scanf("%d%d ",&R,&C);
          gets(str);
          for(int i=0;str[i]!='\0';i++){
              if(str[i] == ' '){
                  strcat(ctr,code[0]);
              }else{
                  strcat(ctr,code[str[i] - 'A' + 1]);
              }
          }
          int len = strlen(ctr),x=0,y=0;
          memset(ctr+len,'0',sizeof(ctr)- sizeof(char)*len);
          memset(a,'#',sizeof(a));
          a[0][0]=ctr[0];
          while(cnt < R*C){
              while(y+1<C && a[x][y+1]== '#') a[x][++y] = ctr[cnt++];
              while(x+1<R && a[x+1][y]== '#') a[++x][y] = ctr[cnt++];
              while(y-1>=0 &&a[x][y-1]=='#') a[x][--y] = ctr[cnt++];
              while(x-1>=0&&a[x-1][y]== '#') a[--x][y] = ctr[cnt++];
          }
      	for(int i =0;i<R;i++){
      		for(int j=0;j<C;j++){
      			putchar(a[i][j]);
      		}
      	}
      	putchar('\n');
          return 0;
      }


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值