openjudge 螺旋加密

简介: /*========================================================================25:螺旋加密总时间限制: 1000ms 内存限制: 65536kB描述 Chip和Dale发明了一种文本信息加密技术。
/*========================================================================
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

相关文章
|
搜索推荐 算法 Go
对Go的切片进行随机排序
使用math/rand包和sort包来对切片进行随机排序
289 0
|
7月前
|
人工智能 自然语言处理
AudioX:颠覆创作!多模态AI一键生成电影级音效+配乐,耳朵的终极盛宴
AudioX 是香港科技大学和月之暗面联合推出的扩散变换器模型,能够从文本、视频、图像等多种模态生成高质量音频和音乐,具备强大的跨模态学习能力和泛化能力。
501 36
AudioX:颠覆创作!多模态AI一键生成电影级音效+配乐,耳朵的终极盛宴
|
10月前
|
SQL 关系型数据库 MySQL
深入解析MySQL的EXPLAIN:指标详解与索引优化
MySQL 中的 `EXPLAIN` 语句用于分析和优化 SQL 查询,帮助你了解查询优化器的执行计划。本文详细介绍了 `EXPLAIN` 输出的各项指标,如 `id`、`select_type`、`table`、`type`、`key` 等,并提供了如何利用这些指标优化索引结构和 SQL 语句的具体方法。通过实战案例,展示了如何通过创建合适索引和调整查询语句来提升查询性能。
1900 10
|
12月前
|
算法 决策智能
基于GA-PSO遗传粒子群混合优化算法的TSP问题求解matlab仿真
本文介绍了基于GA-PSO遗传粒子群混合优化算法解决旅行商问题(TSP)的方法。TSP旨在寻找访问一系列城市并返回起点的最短路径,属于NP难问题。文中详细阐述了遗传算法(GA)和粒子群优化算法(PSO)的基本原理及其在TSP中的应用,展示了如何通过编码、选择、交叉、变异及速度和位置更新等操作优化路径。算法在MATLAB2022a上实现,实验结果表明该方法能有效提高求解效率和解的质量。
|
12月前
|
前端开发 Java Apache
SpringBoot实现电子文件签字+合同系统!
【10月更文挑战第15天】 在现代企业运营中,合同管理和电子文件签字成为了日常活动中不可或缺的一部分。随着技术的发展,电子合同系统因其高效性、安全性和环保性,逐渐取代了传统的纸质合同。本文将详细介绍如何使用SpringBoot框架实现一个电子文件签字和合同管理系统。
854 1
|
机器学习/深度学习 分布式计算 安全
联邦学习的简要概述
联邦学习(Federated Learning, FL)是一种分布式机器学习方法,旨在保护数据隐私的同时,利用多方数据进行模型训练。
956 5
|
存储 NoSQL 算法
5)深度解密 Redis 的哈希(Hash)
5)深度解密 Redis 的哈希(Hash)
209 1
|
机器学习/深度学习 C语言
【C/PTA】循环结构专项练习(选择+填空)
【C/PTA】循环结构专项练习(选择+填空)
563 0
|
JavaScript Java 测试技术
基于SpringBoot+Vue的外卖平台系统的详细设计和实现
基于SpringBoot+Vue的外卖平台系统的详细设计和实现
298 4
|
数据采集 监控 供应链
MES系统软件体系架构及应用
MES系统是数字化车间的核心。MES通过数字化生产过程控制,借助自动化和智能化技术手段,实现车间制造控制智能化、生产过程透明化、制造装备数控化和生产信息集成化。生产管理MES系统主要包括车间管理系统、质量管理系统、资源管理系统及数据采集和分析系统等,由技术平台层、网络层以及设备层实现。
2280 1