全國高級中等學校 104 學年度工業類科學生技藝競賽電腦軟體設計
壹、試卷說明: 1.請將寫好之程式原始檔依題號命名資料夾存檔,第一題取姓名_Q1,第二題取姓名_Q2,依序命名存檔, 並存於 C 碟之資料夾”姓名_Contest”中。 2.競賽時間 4 小時。 3 將程式及編譯成執行檔儲存在 C 碟之資料夾姓名_Contest。 貳、評分說明:本試卷共六題,每題配分不一。 1. 每題評分只有對與錯兩種,對則給滿分,錯則不給分(即以零分計算) 。 2. 每解答完一題上傳(程式及執行檔),評審人員將針對該題進行測試,若解題正確則回應正確,若 解題錯誤則扣該題一分至該題零分為止,答錯之題目可繼續作答。試題一:數獨 4X4 遊戲程式設計(17 分)
說明:設計出能夠玩數獨 4X4 遊戲的程式。需能填滿 4x4 的方格,而每一直行、每一橫列、以及所 分出的 4 個主要 2x2 區塊,必須包含 1 到 4 ,且所有數字同一行不能有相同的數字,同一列不能 有相同的數字及同宮格內(2X2)不能有相同的數字,如圖 1 所示。題目一開始有些方格會先填有數字如 圖2 所示,這些數字為解題的線索。 功能要求(下列四個功能皆完成才可上傳): 1. 表單初始載入 4x4 的方格(label)的初始值如圖 2 所示。 2. 用滑鼠按一下「產生提示」產生候選數數字,如圖 3 所示,例如,第二列已有一個「2」,第一行 已有一個「1」,所以在方格位置第二列第一行(2,1)的候選數字是「3」和「4」,第四列已包含一個「4」, 第一行已有一個「1」,所以在位置第四列第一行(4,1)的候選數字是「2」和「3」,其餘類推。 3. 對尚未決定的方格,先用滑鼠按一下方格,再到下方 command 1,2,3,4 按鈕中的任一個按一下, 如圖4 所示,先用滑鼠按一下方格位置(2,1),再到下方 command 3 按鈕任一個按一下,3 顯示在方格 位置(2,1)。 4. 當對所有方格皆填滿數字,可用滑鼠按一下「check」,方格內的數字皆合乎數獨要求,則顯示正 確,如圖5 所示。若不合乎數獨要求,則顯示錯誤,如圖 6 所示,驗證方式可對每一直行的 4 個方格、 每一橫列的4 個方格、以及每個 2x2 區塊的 4 個方格分別累加其值是否全部皆為 10,若是則正確; 若其中只須一個累加值不為10 則為錯誤。 圖2 2X2 區塊 4 圖 1 2X2 區塊 2 2X2 區塊 3 2X2 區塊 1圖 3 圖4 圖5 圖6
試題 二:名字編碼
(16 分) Soundex 索引系統的開發是為了將發音或拼字相似的名字編碼以方便取用。它被美國戶口普查局所採 用,許多州也用它來為駕照編碼。你的任務是讀取左邊 Name 文字框內一連串的名字,一個名字一行, 然後輸出 Soundex 碼 (每個名字一行)。 說明: 1 每個名字的長度從 1 到 20 個大寫字母 (ASCII 碼 65 到 90),長度不到 20 個字元的名字後面 不會補空白。 2 名字只會有大寫字母。 3 Soundex 碼含有一個字母及其後的三位數字,共 4 個字元。其編碼規則如下: 1.1 名字的第一個字母成為編碼中第一且唯一的字母。 1.2 名字的第二個字母以後,如包含 A, E, I, O, U, Y, W 及 H 等字母,則不列入編碼。 1.3 名字的第二個字母以後,除了 A, E, I, O, U, Y, W 及 H 等字母不編碼,其餘的字母都必須編 碼,除非它緊跟在一個編碼相同的字母之後。例如:SC,因為 S 的編碼是 2,C 的編碼也是 2, 所以第 2 個 C 不編碼。 1.4 雖然 A, E, I, O, U, Y, W 及 H 等字母不列入編碼,但可以拆散兩個連續相同的編碼。例如 SAK, 其中 S 的編碼是 2,A 不編碼,K 的編碼也是 2,因為 A 拆散兩個 2,所以編碼輸出為 22。 1.5 所有名字的編碼都是一位字母加三位數字,不足的位數補 0。1.6 第三位數字之後的編碼捨去。 1.7 Soundex 編碼表如下: 字母 編碼值 B, P, F, V 1 C, S, K, G, J, Q, X, Z 2 D, T 3 L 4 M, N 5 R 6 1.8 範例如下: 範例上面僅是參考測資。
試題 三:單精確度浮點二進制值轉換為十進制實數值系統(17 分)
說明:一個二進制 32 位元單精確度浮點表示值,電子電機工程協會(IEEE)的標準定義如下: 0 10 22 23 30 31 Exponent (8 bits) Mantissa (23 bits) Sign (1 bit)最左邊的 bit 31 為一個符號位元 S (Sign),S 為 0 表示正值,而 S 為 1 則為負值;中間 bits 30~23 為八 個位元之指數值 E (Exponent),採用超 127 (Excess-127)格式,即原有指數值再外加 127,可將 2 的指 數次方 -127 至+128 改以 2 的指數次方 0 至 255 來表示;最右邊 bits 22~0 為 23 個位元之定點數值 M (Mantissa),此正規化(Nomalization)將第 22 位元左邊隱藏了小數點及小數點左邊一個 1,例如 1.011101…,而 23 個位元只記錄 011101…。 例題:一個二進制 32 位元單精確度浮點表示值如下所示,將它轉換為十進制實數值 R。
1 10000110 01000011110000000000000
轉換方法分為四個步驟敘述如下: Step1:首先得知最左邊 bit 31 之符號位元為 S = 1,可判斷此十進制實數值為負值;Step2:其次得知中間 bits 30~23 之八個位元超 127 指數值為 E = 100001102 = 13410,將此超 127 指 數值 E 還原回來的 E = 134 - 127 = 7,即 2 的指數次方 7,也就是 27; Step3:接著得知最右邊 bits 22~0 之 23 個位元定點數值為 M = 010000111100000000000002,將此正 規化 M 值做反正規化(還原隱藏的小數點及小數點左邊一個 1),則還原回來的 M = 1.01000011110000000000002; Step4:最後還原回來二進制浮點表示為 -1.01000011110000000000002×27 = -10100001.1110000000 000002,再將此值轉換為十進制實數值 R = -161.875。 請參考以上例題與轉換方法,設計如下圖所示之系統,當滑鼠點一下 Random 鍵,該系統在 IEEE Excess-127 右方格子內自動產生對應 bit31、bits 30~23 及 bits 22~0 等二進制 32 位元單精確度浮點表 示值,且自動清除 Real number 右方格子內容;另可任意輸入或更改二進制 32 位元單精確度浮點表 示值,但仍限制維持在 32 位元。當滑鼠點一下 Convert 鍵,則將 IEEE Excess-127 右方二進制 32 位 元單精確度浮點表示值轉換為等效的正或負十進制實數值,並顯示在 Real number 的右方格子,小數 點值最多取十位。上述可重複操作,直至以滑鼠點一下 Exit 鍵,則離開此系統。 Convert Real number: IEEE 超 127 單精確度浮點二進制值轉換為十進制實數值系統 Exit IEEE Excess-127: Random 範例
輸入格式:當滑鼠點一下 Random 鍵或人工輸入,則在 IEEE Excess-127 右方格子內自動或人工產 生對應正好 32 位元單精確度浮點二進值,且自動清除 Real number 右方格子內容。 輸出格式:當滑鼠點一下 Convert 鍵,則將 IEEE Excess-127 之 32 位元單精確度浮點二進值轉換
為等效的正或負十進制實數值,顯示在 Real number 的右方格子內,小數點值最多取十 位。 Convert Real number: IEEE 超 127 單精確度浮點二進制值轉換為十進制實數值系統 Exit IEEE Excess-127: 01000011110000000000000 -161.875 Random 1 10000110
試題 四:資料序列之相似度計算程式(17 分)
說明:一、對於處理數字資料串列,可用於時間序列的處理,例如:多日的交易結果的成交值,也可 用於聲頻的特徵值的處理,例如:聲頻的共振峰值。對已有的多筆數字的資料串列,我們 可將其視為樣本資料,透過某種方法,可將這些樣本資料建立出一個樣本模型。若有一時 間序列的資料,或聲頻的共振峰資料,我們即可將此資料與樣本模型進行比對,之後,可 得一值,稱之為相似度,代表此資料與樣本模型接近的程度,相似度的值越大,接近的程 度越高。 二、今有三個數值串列可用以表示樣本模型,詳見圖 7 下方 3 個數值串列,其中數值串列 2 的相似度 為 1 (100%相似),其曲線如圖 1 中間粗線所示;在圖 7 中,對於數值串列 2,以 x=7 為例,數值為 19 時,則其相似度為 1。為了簡化解法,採用線性遞減的方式,數值>=22 時,則其相似度才降為 0; 數值<=17 時,則其相似度也降為 0。其相似度三角圖形如圖 7 上方所示,隨著數值的大小,以直線方 程式表示相似度的增減,且三角形的兩邊不一定是對稱。同理,在數值串列 2 中,再以x=15 為例, 數值為 13 時,則其相似度為 1,數值>=16 或<=10 時,其相似度均降至 0。。 圖 7 樣本模型 三、由圖 7 所示,依三個數值串列,我們得到的相似度模型圖,如圖 7 中間灰階區域所示,中 間粗線代表相似度為 1 的連線,上下兩邊的細線代表相似度降為 0 的連線。一旦獲得此相 似度模型,我們即可用來計算一個未知的資料串列,以求得其相似度。 四、對於未知的資料串列(見圖 8 下方之未知串列),在圖 8 中間以粗虛線段表示。其每一個資 料都與樣本模型對應的資料比對,如同圖 7 之x=7 或 x=15 的資料般,求其個別的相似度, 最後,再求此 21 個相似度的平均相似度,即代表此未知的資料串列與樣本模型相近的程 度。 圖 8 未知的資料串列與相似度模型之比對 五、設計步驟:1. 依據 3 個資料串列建立相似度模型(如圖 7 中間灰階區域)。 2. 輸入未知的資料串列(如圖 8 之粗虛線段者),進行未知的資料串列與相似度模型之比對。 3. 輸出計算的結果。 輸入及輸出格式: 輸入格式(模型): 輸 入 格 式 ( 資 料 串 列 1): 輸出格式: 0.226984 或 輸 入 格 式 ( 資 料 串 列 2): 輸出格式: 0.794445 操作畫面: a. 主選單 b. 選項操作:輸入模型資料 c. 選項操作:計算平均相似度
試題 五:
2 維卷積(2D Convolution) (17 分)
說明:在求線性和時間不變系統的輸出O[m, n]時,常將輸入的 2 維信號 I[m, n] and 核 K[m, n] 做 2
維卷積,這可以表示如下式子:
∑ ∑
∞ −∞ = ∞ −∞ =−
−
×
=
Θ
=
j ij
n
i
m
K
j
i
I
n
m
K
n
m
I
n
m
O
[
,
]
[
,
]
[
,
]
[
,
]
[
,
]
(1) 核K[m, n]的中心是 K[0, 0],假如,核的大小是 3,此核的索引是-1, 0, 1,所以,K[0, 0]是在核的 中間。假設有一核如圖9 所示,此核大小是 3x3,即 m=3, n=3,核中之 9 個值為 a, b, c, …, i,核的原 點是(0, 0),是落在核的中央。假設要計算輸出 m=1, n=1 時,帶入公式(1),可以用圖 10 來表示,注意, 在做2 維卷積時,核(kernel)需要翻動(flipped),再跟輸入(input)重疊部分相乘。例如,如圖 10 所示, 輸入I[0, 0]是和核中的 i 相乘,輸入 I[2, 2]是和核中的 a 相乘。 圖 9 圖 10 另外,為了判斷輸入和輸出的相似度,常用的方法有以下三種方法:1. 平均平方誤差(Mean Square Error,MSE):
[
]
∑∑
= =−
=
H y W xy
x
O
y
x
I
WH
MSE
1 1 2]
,
[
]
,
[
1
(2)2. 平均絕對誤差(Mean Absolute Error,MAE):
∑∑
= =−
=
H y W xy
x
O
y
x
I
WH
MAE
1 1]
,
[
]
,
[
1
(3)3. 峰值訊號雜訊比(Peak Signal to Noise Ratio):
MSE
PSNR
=
10
log
10255
*
255
(4)上述W 和 H 分別表示為寬度和高度,|.|表示絕對值。
請利用上述說明,寫一個程式,能完成以下功能要求: (1) 能讓使用者輸入 7x7 資料,這些資料要大於等於 0,小於等於 255。 (2) 能讓使用者輸入 3x3 核。 (3) 能讓使用者按<運算>執行,得到輸出 O。 (4) 將輸出 O 顯示出來。 (5) 計算輸出 O 和輸入 I 之相似度(MSE, MAE, PSNR),並顯示出來。 程式執行範例: 上圖從左邊開始,第 1 讓使用者輸入 7x7 輸入I 資料,第 2 讓使用者設定 3x3 核 K。
上圖是,第 3 讓使用者按<運算>執行,得到輸出 O。第 4 將輸出 O 顯示出來。同時,顯示MSE, MAE, PSNR
出來。