1. 程式人生 > >ZZULIOJ 2507: 建國的尋寶之旅

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學長提供)

#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;
 		}
 	}
}