openjudge 螺旋加密

/*========================================================================
25:螺旋加密
总时间限制: 1000ms  内存限制: 65536kB
描述
    Chip和Dale发明了一种文本信息加密技术。他们事先秘密约定好矩阵的行数和列数。
    接着,将字符按如下方式编码:
    1. 所有文本只包含大写字母和空格。
    2. 每个字符均赋予一个数值:空格=0,A=1,B=2,……,Y=25,Z=26。
    从左上角开始,按顺时针旋转的方式,将每个字符对应数值的5位二进制数依次填入矩阵。
    最后用0将矩阵补充完整。例如,对于信息“ACM”,行列数均为4时,矩阵将被填充为:
        0000
        1101
        0010
        1100
    其中,A=00001,C=00011,M=01101.
    矩阵中的数字按行连起来形成数字串,完成加密。
    例子中的信息最终会被加密为:0000110100101100。
输入
    一行。首先是两个整数R(1≤R≤20)和C(1≤C≤20),表示行数和列数。
    之后是一个只包含大写字母和空格的字符串。字符串的长度≤(R*C)/5。
    R和C之间以及C和字符串之间均用单个空格隔开。
输出
    一行,为加密后的二进制串。注意你可能需要用0将矩阵补充完整。
样例输入
    4 4 ACM
样例输出
    0000110100101100
来源
    Greater NY 2007
==========================================================================*/
  1 #include<stdio.h>
  2 #include<string.h>
  3
  4 #define localTest  1
  5 #define maxR 23
  6 #define maxC 23
  7
  8 int main(int argc, char *argv[])
  9 {
 10     int R,C,i,j,t,k;
 11     char str[100];
 12     char a[maxR][maxC],dic[27][6],dic2[505]="";
 13     int len;
 14     int R2,C2;
 15
 16     #ifdef localTest
 17         freopen("25.in","r",stdin);
 18     #endif
 19
 20     scanf("%d %d ",&R,&C); //注意这里的输入方式
 21     gets(str);
 22     //printf("%d %d%s\n",R,C,str);
 23
 24     //初始化a[][]数组
 25     for(i=0;i<maxR;i++)
 26         for(j=0;j<maxC;j++)
 27         { a[i][j]=‘0‘; }
 28
 29     //提前准备好二进制数据和字母的映射表
 30     for(i=0;i<27;i++)
 31     {
 32         t=i;
 33         for(j=4;j>=0;j--)
 34         {
 35             dic[i][j]=t%2+‘0‘;
 36             t=t/2;
 37         }
 38         dic[i][5]=‘\0‘;
 39         //printf("%2d-->%s\n",i,dic[i]);  输出字典做检验
 40     }
 41
 42     len=strlen(str);
 43     for(i=0;i<len;i++)
 44     {
 45         if(str[i]==‘ ‘) strcat(dic2,dic[0]);
 46         else
 47         {
 48             t=str[i]-‘A‘+1;;
 49             strcat(dic2,dic[t]);
 50         }
 51     }
 52     //printf("%s\n",dic2);输出检测
 53
 54     if(R==1)//只有一行
 55     {
 56         printf("%s",dic2);
 57         i=len*5+1;
 58         while(i<=C)
 59         {
 60             printf("0");
 61             i++;
 62         }
 63         printf("\n");
 64     }
 65     else if(C==1)//只有一列
 66     {
 67         for(i=0;dic2[i]!=‘\0‘;i++)
 68             printf("%c\n",dic2[i]);
 69         i=len*5+1;
 70         while(i<=R)
 71         {
 72             printf("0\n");
 73             i++;
 74         }
 75     }
 76     else
 77     {
 78         k=0;
 79         i=0;j=0;
 80         R2=R;C2=C;
 81         while(dic2[k]!=‘\0‘)
 82         {
 83             for(t=1;t<C&&dic2[k]!=‘\0‘;t++)
 84             { a[i][j]=dic2[k];k++;j++;}  //填充一个环的上面那一条边
 85             for(t=1;t<R&&dic2[k]!=‘\0‘;t++)
 86             { a[i][j]=dic2[k];k++;i++;}  //填充一个环的右侧那一条边
 87             for(t=1;t<C&&dic2[k]!=‘\0‘;t++)
 88             { a[i][j]=dic2[k];k++;j--;}  //填充一个环的下面那一条边
 89             for(t=1;t<R&&dic2[k]!=‘\0‘;t++)
 90             { a[i][j]=dic2[k];k++;i--;}  //填充一个环的左侧那一条边
 91
 92             i++;j++;
 93             R-=2;C-=2;
 94             if(R==1)//只剩下一行
 95             {
 96                 for(t=1;t<=C&&dic2[k]!=‘\0‘;t++,k++)
 97                 { a[i][j]=dic2[k];j++;}
 98             }
 99             else if(C==1)//只剩下一列
100             {
101                 for(t=1;t<=R&&dic2[k]!=‘\0‘;t++,k++)
102                 { a[i][j]=dic2[k];i++;}
103             }
104         }
105
106         for(i=0;i<R2;i++)//将螺旋矩阵按行输出
107         {
108             for(j=0;j<C2;j++)
109                 printf("%c",a[i][j]);
110             //printf("\n");测试输出
111         }
112     }
113
114     return 0;
115 }

折腾好长时间,同时输入整数和字符串确实有点蛋疼。请注意代码中输入的方式。

另外,螺旋矩阵的旋转遍历也是重点。

最后,要特殊考虑只有一行、一列或者只剩下一行、一列的情况。这个时候要特殊处理。

其他的解题方式也很有参考价值:http://blog.csdn.net/zhengyuan233/article/details/53161002

时间: 2024-11-05 13:49:20

openjudge 螺旋加密的相关文章

noi题库(noi.openjudge.cn) 1.8编程基础之多维数组T21——T25

T21 二维数组右上左下遍历 描述 给定一个row行col列的整数数组array,要求从array[0][0]元素开始,按从左上到右下的对角线顺序遍历整个数组. 输入 输入的第一行上有两个整数,依次为row和col.余下有row行,每行包含col个整数,构成一个二维整数数组.(注:输入的row和col保证0 < row < 100, 0 < col < 100) 输出 按遍历顺序输出每个整数.每个整数占一行. 样例输入 3 4 1 2 4 7 3 5 8 10 6 9 11 12

整理小朋友在noi.openjudge上的作业(1)

NOI(题库正在建设中,做题纪录有可能会被删除,请注意) 第一章的统计放前面 1 编程基础之输入输出 10 0 0% 最基础有空补刷 2 编程基础之变量定义.赋值及转换 10 0 0% 最基础有空补刷 3 编程基础之算术表达式与顺序执行 20 0 0% 最基础有空补刷 4 编程基础之逻辑表达式与条件分支 21 0 0% 最基础有空补刷 5 编程基础之循环控制 45 10 22% 最基础有空补刷 6 编程基础之一维数组 15 5 33% 最基础有空补刷 7 编程基础之字符串 35 0 0% 有必要

AC日记——加密的病历单 openjudge 1.7 12

12:加密的病历单 总时间限制:  1000ms 内存限制:  65536kB 描述 小英是药学专业大三的学生,暑假期间获得了去医院药房实习的机会. 在药房实习期间,小英扎实的专业基础获得了医生的一致好评,得知小英在计算概论中取得过好成绩后,主任又额外交给她一项任务,解密抗战时期被加密过的一些伤员的名单. 经过研究,小英发现了如下加密规律(括号中是一个“原文 -> 密文”的例子) 1.  原文中所有的字符都在字母表中被循环左移了三个位置(dec  -> abz) 2.  逆序存储(abcd -

php7实现基于openssl的加密解密方法

还需要注意的是加密字符串长度问题,如果加密字符串长度太长需要进行分段加解密,如下代码: 加密:(公匙加密,私密一般用来解密) function encrypt($originalData){ $publicKeyFilePath = '/www/ceshi/rsa_public_key.pem'; extension_loaded('openssl') or die('php需要openssl扩展支持'); file_exists($publicKeyFilePath) or die('公钥的文

python实现网页登录时的rsa加密流程

对某些网站的登录包进行抓包时发现,客户端对用户名进行了加密,然后传给服务器进行校验. 使用chrome调试功能断点调试,发现网站用javascript对用户名做了rsa加密. 为了实现网站的自动登录,需要模拟这个加密过程. 网上搜了下关于rsa加密的最简明的解释: rsa加密是非对称加密算法,该算法基于一个十分简单的数论事实:将两个大素数相乘十分容易,但那时想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥,即公钥,而两个大素数组合成私钥.公钥是可发布的供任何人使用,私钥则为自己

人工智能PK透明加密,数据安全保护谁能技高一筹

人工智能一直是全球的一大热点话题,从很久之前谷歌研发的人工智能机器人击败柯洁.李世石等众多围棋高手,到最近特斯拉CEO埃隆o马斯克投资的人工智能研究机构OpenAI研发的机器人击败了国外顶尖Dota 2玩家之一的Danil Ishutin.而重磅消息却是美国电商巨头亚马逊,已准备将人工智能技术用于商业服务中,计划将其用于云存储方面,用于保护用户数据的安全. 亚马逊的这一计划,主要是通过机器学习技术,自动识别.分类和保护用户保存在亚马逊云计算平台上的敏感数据.但引入人工智能技术之后,亚马逊的云存储

Java DES 加密和解密源码

Java密码学结构设计遵循两个原则: 1) 算法的独立性和可靠性. 2) 实现的独立性和相互作用性. 算法的独立性是通过定义密码服务类来获得.用户只需了解密码算法的概念,而不用去关心如何实现这些概念.实现的独立性和相互作用性通过密码服务提供器来实现.密码服务提供器是实现一个或多个密码服务的一个或多个程序包.软件开发商根据一定接口,将各种算法实现后,打包成一个提供器,用户可以安装不同的提供器.安装和配置提供器,可将包含提供器的ZIP和JAR文件放在CLASSPATH下,再编辑Java安全属性文件来

使用JAVA解压加密的中文ZIP压缩包

近来项目中需要对ZIP压缩包解压,然后将解压后的内容存放到指定的目录下. 该压缩包的特性: 使用标准的zip压缩格式(压缩算法没有深入探究) 压缩包中带有目录并且目录名称是中文 压缩时加了密码 因为jre中自带的java.util.zip.*包不支持中文及加密压缩,所以选择使用zip4j包. 下面是解压的实现代码: 1 public class UnZip { 2 private final int BUFF_SIZE = 4096; 3 4 /* 5 获取ZIP文件中的文件名和目录名 6 */

关于数据传输中加密解密那点事儿(一)

随着互联网的兴起,越来越多的信息和资源要通过网络传输完成:然而在这些数据传输中总有一些"无关人员"做一些窃听.盗取.篡改等危害数据安全的行为,所以我们要对数据进行加密处理,以保证数据的安全传输: 所以有了一下几种加密方式: 一.对称加密: 这种算法简单来说就是 数据的发送方和接收方都必须要有同一种密钥(加密数据所用到的密钥),在数据的传输中 数据与密钥都通过加密的方式传送: 特性:在数据加密中,数据被分成固定大的块,逐个加密:加密和解密速度也快: 缺陷:因为加密和解密使用同一种密钥,所