建国的寻宝之旅
题目描述
建国在元旦假期出去进行寻宝活动,在路上偶遇了也在寻宝的印第安纳·琼斯,于是他们组队去寻宝。到达藏宝图上的目标地点之后,他们发现洞穴的入口处有个机关,聪明的建国很快就发现了破解这个机关的方法。
机关是这样的:
机关的旁边有一张正方形石板,上面有着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 ---------
解题思路:本题虽然在操作之后要改变每一个字符,但是更要注意的是在改变字符的
同时,位置也会发生改变,需要自己仔细想一想该如何改变位置,而操作也不能进行
一次操作就改变一次,这会十分麻烦,所以我们可以将操作进行一个汇总,最后再将
度数取余360看看进行的是什么操作,最后其实只有四种情况,一是位置没有发生改
变,二是顺时针90度或逆时针270度,三是顺时针180或逆时针180,四是顺时针270
或逆时针90
代码如下
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
scanf("%d",&n);
char MAP[1005][1005] = {0};
char a[1005] = {0};
for(int i = 0; i < n; i++)
scanf("%s", MAP[i]);
scanf("%s", a);
int len = strlen(a);
int ans = 0;//计算总操作 ,顺时针加,逆时针减
for(int i = 0; i < len; i++)
{
if(a[i] == '1')
ans = ans + 90;
else if(a[i] == '2')
ans = ans + 180;
else if(a[i] == '3')
ans = ans + 270;
else if(a[i] == '4')
ans = ans - 90;
else if(a[i] == '5')
ans = ans - 180;
else
ans = ans - 270;
}
ans = ans % 360;//取余360看看到底进行的是哪种操作
if(ans == 0) //当没有改变时直接输出
for(int i = 0; i < n; i++)
{
for(int j = 0; j < n; j++)
printf("%c", MAP[i][j]);
printf("\n");
}
if(ans == 90||ans == -270)
{
for(int i = 0; i < n; i++)
{
for(int j = 0; j < n; j++)
{
if(MAP[i][j] == 'M')
MAP[i][j] = '3';
else if(MAP[i][j] == 'W')
MAP[i][j] = 'E';
else if(MAP[i][j] == '3')
MAP[i][j] = 'W';
else if(MAP[i][j] == 'E')
MAP[i][j] = 'M';
else if(MAP[i][j] == '-')
MAP[i][j] = '|';
else if(MAP[i][j] == '|')
MAP[i][j] = '-';
}
}
for(int i = 0; i < n; i++) //改变位置输出结果,以下同理
{
for(int j = n - 1; j >= 0; j--)
printf("%c",MAP[j][i]);
printf("\n");
}
}
if(ans == 180 || ans == -180)
{
for(int i = 0; i < n; i++)
{
for(int j = 0; j < n; j++)
{
if(MAP[i][j] == 'M')
MAP[i][j] = 'W';
else if(MAP[i][j] == 'W')
MAP[i][j] = 'M';
else if(MAP[i][j] == '3')
MAP[i][j] = 'E';
else if(MAP[i][j] == 'E')
MAP[i][j] = '3';
}
}
for(int i = n - 1; i >= 0; i--)
{
for(int j = n - 1; j >= 0; j--)
printf("%c",MAP[i][j]);
printf("\n");
}
}
if(ans == -90 || ans == 270)
{
for(int i = 0; i < n; i++)
{
for(int j = 0; j < n; j++)
{
if(MAP[i][j] == 'M')
MAP[i][j]='E';
else if(MAP[i][j] == 'W')
MAP[i][j]='3';
else if(MAP[i][j] == '3')
MAP[i][j]='M';
else if(MAP[i][j] == 'E')
MAP[i][j]='W';
else if(MAP[i][j] == '-')
MAP[i][j]='|';
else if(MAP[i][j] == '|')
MAP[i][j]='-';
}
}
for(int i = n - 1; i >= 0; i--)
{
for(int j = 0; j < n; j++)
printf("%c",MAP[j][i]);
printf("\n");
}
}
}