[ZJ][翻轉處理] a315. D 滿州國皇帝之璽
內容 :
民國初年,國民政府初成立之時時局相當紛亂。此時日本人趁機佔據中國東北並建立魁儡政權滿州國並命愛新覺羅 · 溥儀為執政。西元 1934 年,溥儀自立為滿州帝國皇帝,並沾沾自喜地請人刻了一個皇帝用的玉璽。
有一天,溥儀的姪子毓喦在皇宮地上撿到了這個玉璽,一個興起就拿起玉璽在原來是空白的牆上到處蓋印子。
我們知道玉璽的圖案是什麼形狀,也知道毓喦在牆上的那些地方以哪些角度蓋了印子。請問在毓喦結束他的遊戲時,牆上的圖案會是什麼樣子呢?毓喦蓋印子的位置以玉璽最左上角的格子在牆上的座標表示,牆的最左上角的座標為 (0, 0)。
舉個例子,假設玉璽的圖案如圖 A,而毓喦將玉璽順時針旋轉 90 度後蓋在 (0, 2) 的位置 (如圖 B),接著將玉璽由圖 A 的狀態順時針旋轉 0 度後蓋在 (2, 0) 的位置 (如圖 C)。
注意在這裡牆壁和玉璽的形狀都是正方形的。
輸入說明
:
輸入的第一行有一個正整數 T,代表測試資料的組數 (1 ≤ T ≤ 10)。
每組測試資料以三個整數 1 ≤ N, M, K ≤ 10 開頭,N 代表牆面的邊長,M 代表玉璽的邊長,而 K 則表示毓喦總共蓋了幾個印子在牆上。接下來 H 行輸入代表玉璽的圖案,'#'表示這一格可以印出顏色,而 '.'表示這一格不會印出顏色。每筆資料的最後 K 行各包含三個整數 Y, X, R (-10000 ≤ Y, X ≤ 10000),其中 (Y, X) 代表毓喦蓋印子的位置,而 R (1 ≤ R ≤ 10) 則代表蓋印子的角度,如下方表示:
0 代表順時針旋轉 0 度;
1 代表順時針旋轉 90 度;
2 代表順時針旋轉 180 度;
3 代表順時針旋轉 270 度。
因為毓喦年紀尚小手腳不太靈活,有時會不小心把部分或整個印子蓋到牆壁範圍的外面,所以牆上的印子不一定都是完整玉璽的圖案。
輸出說明
:
範例輸入 :
3 5 3 2 .## .#. ##. 0 2 1 2 0 0 3 5 3 ###.# ..#.# ##### #.#.. #.### −2 −2 0 −1 −2 2 −1 −1 1 5 4 0 .... .... .... ....
範例輸出 :
..#.. ..### .##.# .#... ##... ### ### ### ..... ..... ..... ..... .....
提示
:
出處
:
範測的 - 都是全形的,測試的時候要注意一下。
接著就是範例給的 YX 範圍是正負一萬,差點以為要離散化處理。
不過不予理會,處理上也不會有這問題。
/**********************************************************************************/
/* Problem: a315 "D 滿州國皇帝之璽" from 2011 NPSC 國中組初賽 */
/* Language: CPP (1997 Bytes) */
/* Result: AC(4ms, 256KB) judge by this@ZeroJudge */
/* Author: morris1028 at 2013-01-26 12:47:54 */
/**********************************************************************************/
#include <stdio.h>
int main() {
int t, n, m, p, x, y, r;
int i, j, k, a, b;
char G[105][105], A[105][105];
scanf("%d", &t);
while(t--) {
scanf("%d %d %d", &n, &m, &p);
for(i = 0; i < m; i++)
scanf("%s", G[i]);
for(i = 0; i < n; i++)
for(j = 0; j < n; j++)
A[i][j] = '.';
while(p--) {
scanf("%d %d %d", &x, &y, &r);
if(r == 0) {
for(i = 0; i < m; i++)
for(j = 0; j < m; j++)
if(x+i >= 0 && x+i < n && y+j >= 0 && y+j < n) {
if(G[i][j] == '#')
A[x+i][y+j] = '#';
}
} else if(r == 1) {
for(j = 0, a = 0; j < m; j++, a++)
for(i = m-1, b = 0; i >= 0; i--, b++)
if(x+a >= 0 && x+a < n && y+b >= 0 && y+b < n)
if(G[i][j] == '#')
A[x+a][y+b] = '#';
} else if(r == 2) {
for(i = m-1, a = 0; i >= 0; i--, a++)
for(j = m-1, b = 0; j >= 0; j--, b++)
if(x+a >= 0 && x+a < n && y+b >= 0 && y+b < n)
if(G[i][j] == '#')
A[x+a][y+b] = '#';
} else {
for(j = m-1, a = 0; j >= 0; j--, a++)
for(i = 0, b = 0; i < m; i++, b++)
if(x+a >= 0 && x+a < n && y+b >= 0 && y+b < n)
if(G[i][j] == '#')
A[x+a][y+b] = '#';
}
}
for(i = 0; i < n; i++, puts(""))
for(j = 0; j < n; j++)
putchar(A[i][j]);
}
return 0;
}
/*
3
5 3 2
.##
.#.
##.
0 2 1
2 0 0
3 5 3
###.#
..#.#
#####
#.#..
#.###
-2 -2 0
-1 -2 2
-1 -1 1
5 4 0
....
....
....
....
*/