ZZULI - 建国的寻宝之旅(字符串处理)
发布日期:2021-07-01 00:16:05 浏览次数:2 分类:技术文章

本文共 3614 字,大约阅读时间需要 12 分钟。

题目链接:

时间限制: 1 Sec  内存限制: 128 MB

题目描述

    建国在元旦假期出去进行寻宝活动,在路上偶遇了也在寻宝的印第安纳·琼斯,于是他们组队去寻宝。到达藏宝图上的目标地点之后,他们发现洞穴的入口处有个机关,聪明的建国很快就发现了破解这个机关的方法。

机关是这样的:
机关的旁边有一张正方形石板,上面有着n x n的格子,每个格子里都有一个镂空的符号。 
这块石板可以进行6种操作: 
1.将石板顺时针旋转90° 
2.将石板顺时针旋转180° 
3.将石板顺时针旋转270° 
4.将石板逆时针旋转90° 
5.将石板逆时针旋转180° 
6.将石板逆时针旋转270° 
 
石板上有'M','W','3','E','|','-','.'七种符号,
每次石板通过一个操作的时候,不仅仅石板上每个格子的位置要变,对应方格上面的图形由于翻转也发生了相应的改变。
现在我们定义符号对应每一种操作之后的符号变换: 
 
     
                 
洞穴的墙壁上还有一串数字,表示操作石板的顺序,只需要按照墙壁上的顺序操作完石板,就得到了进入洞穴的密码。 
 请帮助印第安纳·琼斯将洞穴里的宝物放进博物馆里。

输入

首先输入一个整数n,表示矩阵的边长。(1 <= n <= 1000)

接下来输入一个n x n的字母矩阵,表示刚开始石板的形状。
最后一行输入一个字符串(只包含1-6的数字,每个数字的大小对应的相应操作),代表一系列的操作(表示操作的字符串的长度|s| , 1<=|s|<=1000)。

输出

输出一个n x n的字母矩阵,表示所有操作执行完后石板的形状。

样例输入

9

MMMMMMMMM
WWWWWWWWW
|||||||||
---------
.........
.........
EEEEEEEEE
333333333
---------
123456

样例输出

MMMMMMMMM

WWWWWWWWW
|||||||||
---------
.........
.........
EEEEEEEEE
333333333
---------

解题思路

按着上面的步骤模拟一下应该就可以了,不过首先先对那些操作进行一些处理。我们可以发现操作1和6、操作2和5、操作3和4,得到的结果是一样的,还有就是,操作1和3进行4遍、操作2进行2遍就会变回来,和不进行没啥区别,这样处理后就会大大的节约时间。

#include 
int n;struct edgd { char str[1005][1005];}p, q;char edge(char ch, int p) { switch(p) { case 1: { switch(ch) { case 'M': return '3'; case 'W': return 'E'; case '3': return 'W'; case 'E': return 'M'; case '|': return '-'; case '-': return '|'; case '.': return '.'; } }; break; case 2: { switch(ch) { case 'M': return 'W'; case 'W': return 'M'; case '3': return 'E'; case 'E': return '3'; case '|': return '|'; case '-': return '-'; case '.': return '.'; } }; break; case 3: { switch(ch) { case 'M': return 'E'; case 'W': return '3'; case '3': return 'M'; case 'E': return 'W'; case '|': return '-'; case '-': return '|'; case '.': return '.'; } }; break; }}edgd edgg(edgd p, int r) { switch(r) { case 1: { for (int i = 0; i < n; i++) for (int j = 0; j < n; j++) q.str[i][j] = p.str[n - j - 1][i]; }; break; case 2: { for (int i = 0; i < n; i++) for (int j = 0; j < n; j++) q.str[i][j] = p.str[n - i - 1][n - j - 1]; }; break; case 3: { for (int i = 0; i < n; i++) for (int j = 0; j < n; j++) q.str[i][j] = p.str[j][n - i - 1]; }; break; } return q;}int main() { char ch; while (~scanf("%d", &n)) { ch = 0; int a[5] = {0}; for (int i = 0; i < n; i++) scanf("%s", p.str[i]); while ((ch = getchar()) && (ch < '1' || ch > '6')); while (ch >= '1' && ch <= '6') { if (ch - '0' > 3) a['7' - ch]++; else a[ch - '0']++; ch = getchar(); } if (a[1] < a[3]) { a[3] -= a[1]; a[1] = 0; a[3] %= 4; } else { a[1] -= a[3]; a[3] = 0; a[1] %= 4; } a[2] &= 1; for (int i = 1; i < 4; i++) { while (a[i]--) { for (int k = 0; k < n; k++) for (int j = 0; j < n; j++) p.str[k][j] = edge(p.str[k][j], i); p = edgg(p, i); } } for (int i = 0; i < n; i++) puts(p.str[i]); } return 0;}

转载地址:https://lzyws739307453.blog.csdn.net/article/details/86102941 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:校园导游系统(课程设计)
下一篇:ZZULI - 建勋的魔法学院

发表评论

最新留言

感谢大佬
[***.8.128.20]2024年04月26日 11时15分51秒