欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

OpenJudge NOI 1.8 25:螺旋加密

发布时间:2025/3/17 编程问答 77 豆豆
生活随笔 收集整理的这篇文章主要介绍了 OpenJudge NOI 1.8 25:螺旋加密 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

【题目链接】

OpenJudge NOI 1.8 25:螺旋加密

【题目考点】

1. 进制转换

2. 二维数组

【解题思路】

先cin整型变量读入行列数r与c,再用cin.get()或getchar()吸收一个空格,再使用cin.getline()读入带空格的字符串
遍历字符串,把每个字符转为对应的数字,将数字转为二进制数字,以回形遍历方式填充到二维数组中。
回形遍历的写法可以参考OpenJudge NOI 1.8 23:二维数组回形遍历
最后按行遍历二维数组,输出数字即可。

【题解代码】

解法1:

#include <bits/stdc++.h> using namespace std; int r, c, a[25][25], fi, fj;//(fi, fj)焦点位置 int d, dir[4][2] = {{0,1},{1,0},{0,-1},{-1,0}};//右下左上 int main() {char s[85];cin >> r >> c;getchar();//吸收空格cin.getline(s, 105);int len = strlen(s), num, si, sj;fi = fj = 1;//初始焦点位置为(1,1) memset(a, -1, sizeof(a));//a初值都设为-1 for(int i = 0; i < len; ++i){if(s[i] == ' ')num = 0;elsenum = s[i] - 'A' + 1;int b[6] = {}, bi = 0;//把num转化成的二进制数字填入数组b,b[1]为低位 b[5]为高位for(int a = num; a > 0; a /= 2)b[++bi] = a % 2;for(int j = 5; j >= 1; --j)//从高位遍历到低位 {a[fi][fj] = b[j];//回形填充到数组a si = fi + dir[d][0], sj = fj + dir[d][1];//(si,sj)下一个位置if(si > r || si < 1 || sj > c || sj < 1 || a[si][sj] != -1)//如果下一次移出了范围或下一个位置有值 d = (d + 1) % 4;//改变方向 fi += dir[d][0], fj += dir[d][1];//移动焦点}}for(int i = 1; i <= r; ++i)for(int j = 1; j <= c; ++j)if(a[i][j] == -1)//值为-1的地方应该填充0 a[i][j] = 0;for(int i = 1; i <= r; ++i)for(int j = 1; j <= c; ++j)cout << a[i][j];return 0; }

总结

以上是生活随笔为你收集整理的OpenJudge NOI 1.8 25:螺旋加密的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。