#16457: C的解題思路


freedom501999@gmail.com (帥氣魔方生)

學校 : 不指定學校
編號 : 88611
來源 : [39.8.203.54]
最後登入時間 :
2019-05-30 22:56:25
d537. 4. 染色遊戲 -- 98學年度北基區資訊學科能力競賽 | From: [27.52.77.116] | 發表日期 : 2019-01-02 23:53

這題請準備三個全域陣列,分別給 紅、黃、藍,並且陣列元素初值全都是 0 代表白底

將顏色轉換成數字,令 R=1、Y=2、B=4,就可以湊出所有顏色且不重複

R  Y  O  B  P  G  D

1  2  3  4  5   6  7

讀到 n 確定白紙大小,讀到座標分別確定三色各自起始點

接下來就是顏色擴散的函式,在最下面

然後用一個變數把三張紙的值相加,得到一個顏色的代表值

( 想像 3 張透明墊板,分別塗上RYB,然後三張疊起來,顏色重疊處就是三張紙的值相加結果)

( 例如 R + Y =>O 、Y + B => G )

統計題目要求的顏色隨時間變化時曾出現的最大值,即是答案

 

/* map 就是某顏色的色紙,n 是題目邊長,start 是顏色擴散中心點,time 是時間,從 0 開始 */

void color_spread(char map[100][100], int n, int start, int time)
{
      int i,  j,  a=start/n,  b=start%n;
      int c=map[a][b];                               /* c 是顏色的代表值,1或2或4 */
      for(i=a-time;i<=a+time;i++)           /* 以中心點向上下左右跑 */
      {
            for(j=b-time;j<=b+time;j++)
            {
                  if(i<0 || i>=n || j<0 || j>=n)   /* 超過邊界的要跳過 */
                        continue;
                  else if(map[i][j])                       /* 已經有顏色的格子跳過 */
                        continue;
                  else
                        map[i][j]=c;
            }
      }
}

/* RYB三色每擴散一次,就統計疊加後的顏色,不用再開一個陣列儲存 */

/* 只要記錄題目要求的某色在該時刻共佔多少面積,並與最大值比較即可 */

 
ZeroJudge Forum