建国的寻宝之旅

建国的寻宝之旅

题目描述

    建国在元旦假期出去进行寻宝活动,在路上偶遇了也在寻宝的印第安纳·琼斯,于是他们组队去寻宝。到达藏宝图上的目标地点之后,他们发现洞穴的入口处有个机关,聪明的建国很快就发现了破解这个机关的方法。
机关是这样的:
机关的旁边有一张正方形石板,上面有着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");
		}
	}
}

猜你喜欢

转载自blog.csdn.net/w__000000wbt/article/details/85775718
今日推荐