2011-08-09 07:55:11Morris

a202. 學長的鬼腳圖

a202. 學長的鬼腳圖

內容 :

大家有沒有玩過這個遊戲?

┬─────┬─
┴──┬──┴─ ......可無限延伸
───┴────

當所走的直線遇到橫線則必須轉彎

並且不得出現├┼┤連在一起的橫線

上面那個圖可以變這樣

A┬─────┬─C
B┴──┬──┴─B ......可無限延伸
C───┴────A
(測資內容已於2011年8月4日修正 , 謝謝學長的提醒) 

輸入說明 :

輸入橫向的行數(x) 直向列數(y) 以及轉彎點(有為O 沒有為X)
直向列數是指畫轉換橫線的地方
其中 y <= 26 && x <= 26 
X ┬─────┬
O │          │←
X ┴──┬──┴  這兩行
O       │      ←
X ───┴───

輸出說明 :

畫出直觀的圖並有走完後的結果

( 如果是鬼腳圖,請在下方輸出一行空白再換行(寬度 = x) ) 

( 如果是ERROR,請換行,不用空白 ) 

範例輸入 :

7 5
OPPOPPO
POPPOPP
PPOPPOP
OPPOPPO
POPPOPP

3 2
POP
POP       (有橫線在一起的錯誤)

範例輸出 :

A-------E
 |  |  |
B-------C
  |  |  
C-------F
   |  | 
D-------D
 |  |  |
E-------B
  |  |  
F-------A  (因瀏覽器有所不同,請參考下方提示圖片)
           
ERROR
           

提示 :

背景知識: 矩陣

如果對鬼腳圖很不了解的人! 可以去google 一下!

左邊字母從 A - Z ! 測資量頗大,請注意效率!

http://ppt.cc/(Nza      ( 建議網址  ) 

範例測資  ( 圖片請看上方連結,範例輸出因瀏覽器不同格式有所異! )

出處 :

成功電研社學長 (管理:stanley17112000)


作法 : 純模擬

/**********************************************************************************/
/*  Problem: a202 "學長的鬼腳圖 " from 成功電研社學長                */
/*  Language: C                                                                   */
/*  Result: AC (5ms, 192KB) on ZeroJudge                                          */
/*  Author: morris1028 at 2011-08-04 21:21:14                                     */
/**********************************************************************************/


#include<stdio.h>
#include<string.h>
#define L 25
char map[27][L];
main() {
    int a, b, rh, ch, C = 0;
    for(a = 0; a < L; a++)    map[0][a] = 'P';
    while(scanf("%d %d", &rh, &ch) == 2) {
        getchar();
        int flag = 1;
        for(a = 1; a <= ch; a++) {
            gets(map[a]);
            for(b = 0; map[a][b] && flag; b++)
                if(map[a][b] == 'O' && map[a-1][b] == map[a][b])
                    flag = 0;
        }
        if(!flag)    {puts("ERROR");continue;}
        else {
            char Ans[26], t;
            for(a = 0; a <= ch; a++)    Ans[a] = 'A'+a;
            for(a = 0; a < rh; a++) {
                for(b = 1; b <= ch; b++)
                    if(map[b][a] == 'O')
                        t = Ans[b-1], Ans[b-1] = Ans[b], Ans[b] = t;            
            }
            char A[L], l = 0;    
            A[l++] = 'A';
            for(b = 0; b < rh; b++)    A[l++] = '-';
            A[l++] = Ans[0];
            A[l] = '\0', puts(A), l = 0;
            for(a = 1; a <= ch; a++) {
                A[l++] = ' ';
                for(b = 0; map[a][b]; b++)
                    A[l++] = map[a][b] == 'O' ? '|' : ' ';
                A[l] = '\0', puts(A), l = 0;
                A[l++] = 'A'+a;
                for(b = 0; b < rh; b++)    A[l++] = '-';
                A[l++] = Ans[a];
                A[l] = '\0', puts(A), l = 0;
            }
        }
        puts(" ");
    }
    return 0;
}
林柏維 2017-05-26 02:59:30

可以請問一下是怎麼判斷最後答案嗎

版主回應
如果你想問的是鬼腳圖最終答案的位置,我有跑兩層迴圈,
其模擬交換位置的操作放在 Ans[] 陣列,之後才開始印出答案。
----
鬼腳圖其實也是排序算法的示意圖的一種 ...
2017-05-27 10:39:05