ZZULIOJ 2507: 建国的寻宝之旅

题目描述

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

样例输入 Copy

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

样例输出 Copy

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

AC代码(感谢ZHY/PK学长提供)

扫描二维码关注公众号,回复: 4869328 查看本文章
#include <bits/stdc++.h>
const int MAXN = 1e3 +5;
using namespace std;
char maps[MAXN][MAXN];
map<char, int> mp;
const char w[] = "M3WE";
const char c[] = "-|";
void init()
{
	 mp.insert(pair<char, int>('M', 0));
	 mp.insert(pair<char, int>('3', 1));
	 mp.insert(pair<char, int>('W', 2));
	 mp.insert(pair<char, int>('E', 3));
	 mp.insert(pair<char, int>('|', 1));
	 mp.insert(pair<char, int>('-', 0));
	 mp.insert(pair<char, int>('.', 0));
}
int main()
{
 	init();
	int n;
 	cin >> n;
 	for(int i = 0; i < n; i++)
	{
 		cin >> maps[i];
 	}
 	string s;
 	cin >> s;
 	int op = 0;
 	for(int i = 0; i < s.length(); i++)
	{
 		int fx = (int)(s[i]-'0');
 		if(fx > 3) fx = 7-fx;
 		op = (op+fx)%4;
	}
	for(int i = 0; i < n; i++)
	{
 		for(int j = 0; j < n; j++)
		{
 			if(maps[i][j] == '.') 
			continue;
 			else if(maps[i][j] == '|' || maps[i][j] == '-')
			{
 				maps[i][j] = c[(mp[maps[i][j]]+op)%2];
 			}
 			else
			{
 				maps[i][j] = w[(mp[maps[i][j]]+op)%4];
 			}
 		}
 	}
 	if(op == 0)
	{
 		for(int i = 0; i < n; i++)
		{
 			for(int j = 0; j < n; j++)
			{
 				cout << maps[i][j];
 			}
 			cout << endl;
 		}
 	}
 	else if(op == 1)
	{
 		for(int i = 0; i < n; i++)
		{
 			for(int j = n-1; j >= 0; j--)
			{
 				cout << maps[j][i];
 			}
 			cout << endl;
 		}
 	}
 	else if(op == 2)
	{
 		for(int i = n-1; i >= 0; i--)
		{
 			for(int j = n-1; j >= 0; j--)
			{
 				cout << maps[i][j];
 			}
 			cout << endl;
 		}
 	}
 	else if(op == 3)
	{
 		for(int i = n-1; i >= 0; i--)
		{
 			for(int j = 0; j < n; j++)
			{
 				cout << maps[j][i];
 			}
 			cout << endl;
 		}
 	}
}

猜你喜欢

转载自blog.csdn.net/basketball616/article/details/85862731
今日推荐