24h購物| | PChome| 登入
2013-01-27 08:41:48| 人氣768| 回應0 | 上一篇 | 下一篇

[ZJ][翻轉處理] a315. D 滿州國皇帝之璽

推薦 0 收藏 0 轉貼0 訂閱站台

內容 :

  民國初年,國民政府初成立之時時局相當紛亂。此時日本人趁機佔據中國東北並建立魁儡政權滿州國並命愛新覺羅 · 溥儀為執政。西元 1934 年,溥儀自立為滿州帝國皇帝,並沾沾自喜地請人刻了一個皇帝用的玉璽。

  有一天,溥儀的姪子毓喦在皇宮地上撿到了這個玉璽,一個興起就拿起玉璽在原來是空白的牆上到處蓋印子。

  我們知道玉璽的圖案是什麼形狀,也知道毓喦在牆上的那些地方以哪些角度蓋了印子。請問在毓喦結束他的遊戲時,牆上的圖案會是什麼樣子呢?毓喦蓋印子的位置以玉璽最左上角的格子在牆上的座標表示,牆的最左上角的座標為 (0, 0)。

  舉個例子,假設玉璽的圖案如圖 A,而毓喦將玉璽順時針旋轉 90 度後蓋在 (0, 2) 的位置 (如圖 B),接著將玉璽由圖 A 的狀態順時針旋轉 0 度後蓋在 (2, 0) 的位置 (如圖 C)。

 

  注意在這裡牆壁和玉璽的形狀都是正方形的。

輸入說明 :

輸入的第一行有一個正整數 T,代表測試資料的組數 (1 T 10)。

  每組測試資料以三個整數 1 ≤ NMK 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 度。

因為毓喦年紀尚小手腳不太靈活,有時會不小心把部分或整個印子蓋到牆壁範圍的外面,所以牆上的印子不一定都是完整玉璽的圖案。

輸出說明 :

對於每一筆測試資料請輸出一個 N × N 的圖形代表牆面上的圖案。

範例輸入 :help

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
....
....
....
....

範例輸出 :

..#..
..###
.##.#
.#...
##...
###
###
###
.....
.....
.....
.....
.....

提示 :

官方測資未公布,目前只含範例測資。測資公布後重測。

出處 :

2011 NPSC 國中組初賽 (管理:pcshic)

範測的 - 都是全形的,測試的時候要注意一下。

接著就是範例給的 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
....
....
....
....
*/

台長: Morris
人氣(768) | 回應(0)| 推薦 (0)| 收藏 (0)| 轉寄
全站分類: 不分類 | 個人分類: NPSC |
此分類下一篇:[NPSC][歸併樹] a656. E. 胖胖天天天胖
此分類上一篇:[ZJ][DP] d944. B. 卡卡跑丁車

是 (若未登入"個人新聞台帳號"則看不到回覆唷!)
* 請輸入識別碼:
請輸入圖片中算式的結果(可能為0) 
(有*為必填)
TOP
詳全文