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

建國的尋寶之旅

建國的尋寶之旅

題目描述

    建國在元旦假期出去進行尋寶活動,在路上偶遇了也在尋寶的印第安納·瓊斯,於是他們組隊去尋寶。到達藏寶圖上的目標地點之後,他們發現洞穴的入口處有個機關,聰明的建國很快就發現了破解這個機關的方法。
機關是這樣的:
機關的旁邊有一張正方形石板,上面有著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");
		}
	}
}