| # | Problem | Pass Rate (passed user / total user) |
|---|---|---|
| 14867 | Matrix Max Rotate |
|
| 14868 | Best Gomoku Move |
|
| 14869 | Walk Through The Map |
|
| 14870 | Order Ranker |
|
Description
給定一個大小為 N × M 的整數矩陣,請你進行以下運算:
步驟一:每一個 2×2 區塊取最大值
1.將矩陣從左到右、從上到下分成許多 不重疊的 2×2 區塊
2.每一個 2×2 區塊取出其中的 最大值
3.使用這些最大值組成一個新的矩陣並輸出
4.如果最右邊或最下面的格子無法組成完整的 2×2 區塊,則忽略它們
步驟二:將壓縮後的矩陣整體進行「逆時針旋轉一格」
所謂「逆時針旋轉一格」指的是:
最外圈的元素沿著外圈路徑逆時針移動一格
中間如果還有更小的圈,依序同樣逆時針挪動一格(就像多層同心方形)
步驟二的實際旋轉方式如下,當直行與橫列相同時:

當直行與橫列不同時:

Input
N M
a11 a12 ... a1M
a21 a22 ... a2M
...
aN1 aN2 ... aNM
Note:
1.第一行:兩個正整數 N、M(2 ≤ N,M ≤ 100);接下來 N 行:每行 M 個整數 aij(0 ≤ aij ≤ 1000),表示矩陣元素
Output
b11 b12 ... b1M'
b21 b22 ... b2M'
...
bN'1 bN'2 ... bN'M'
Note:
1. 輸出的最後必須要有一個換行符號 (“\n”)
2.元素間以空格分隔
Sample Input Download
Sample Output Download
Discuss
Description
給定一個大小為 N × N 的五子棋棋盤,每個格子用整數表示棋子的狀態:
0:空格
1:玩家A的棋子
2:玩家B的棋子
請你計算玩家A的下一步最佳落子位置,目標是:
優先完成連續 5 顆棋子(橫、直、斜都算)
若沒有立刻勝利的機會,選擇可以增加連線長度最多的空格
若有多個候選位置分數相同,先選擇行號最小(直行),再選擇列號最小(橫列)
hint:
1.連線長度指從該空格開始,計算落子後在四個方向(橫、直、兩條對角線)的最大連續 A 棋子數。
2.最終落子位置應是空格(0)。
Input
N
row1
row2
...
rowN
Note:
第一行:棋盤大小 N(5 ≤ N ≤ 20);接下來 N 行:每行 N 個整數(0、1、2),用空格分隔
Output
r c
Note:
1.r、c 表示最佳落子直行編號與橫列編號(從 0 開始)
2. 輸出的最後必須要有一個換行符號 (“\n”)
Sample Input Download
Sample Output Download
Discuss
Description
給定一個 5×5 的二維陣列 map 與一個長度為 10 的 enum 型別陣列。map 中的 'x' 代表玩家的位置,字元 '#' 代表障礙物,enum型別陣列中movement的每個元素代表接下來的移動方向。玩家將依序執行這 10 個移動指令,並更新最終位置,移動方向遇到障礙物時則不移動至該方向。
給定主要執行程式main.c (題號.c)、以及Header檔function.h (題號.h);請試著完成Header檔中未實現的函式:mapMove()
function.h:
enum Move(其中包含四個移動方向)
- U: 代表向上移動
- R: 代表向右移動
- D: 代表向下移動
- L: 代表向左移動
Methods:
- void mapMove(char map[5][5], enum Move *movement) – 將傳入5*5二維陣列map,和enum陣列的第一個位址的指標;找出移動後抵達的位置,並印出,若移動超出地圖範圍,請輸出"Out of Boundary!”
hint:
- 可以透過movement++來取得enum陣列中的下一個元素
function.c
Input
輸入符合以下格式
map
movement
Note:
- map代表地圖,為5*5的陣列,其中 ’x ’為人的所在位置,’#’為障礙物
- movement為一個由enum Move組成的陣列,長度為10(陣列中含10個enum元素)
- main.c 已處理輸入,不需自行處理
(詳見Sample Input)
Output
輸出符合以下格式:
移動距離在地圖內:(印出地圖以及人移動後的位置)
--#--
-----
--x--
---#-
-----
移動距離超過地圖:
Out of Boundary!
Note:
- 輸出的最後必須要有一個換行符號 ('\n')
- 輸出部分需在mapMove() 中實作
Sample Input Download
Sample Output Download
Partial Judge Code
14869.cPartial Judge Header
14869.hDiscuss
Description
電子商務系統中,每筆訂單都有三個屬性:
Amount(金額):訂單總價,範圍 0~20000
ShippingDays(運送天數):下單到到貨天數,範圍 1~30
CustomerRating(顧客信用評分):範圍 0~100
此外,系統對於訂單有折扣策略:
食品類 (FOOD):9 折
其他類別:原價
訂單分類如下:
HighPriority:高金額 (>=10000) 且 顧客評分高 (>=70) 且 快速運送 (<=3 天)
MediumPriority:高金額 (>=10000) 或 顧客評分高 (>=70),但不符合 HighPriority
LowPriority:低金額 (<10000) 且 顧客評分低 (<70) 且 慢速運送 (>7 天)
Standard:其他訂單
給定主要執行程式main.c (題號.c)、以及Header檔function.h (題號.h);請試著完成Header檔中未實現的函式:SetOrderValue()、CalculateFinalAmount()、GetOrderPriority()、CountPriority()
function.h:
methods:
-float CalculateFinalAmount(Order *firstOrder) – 需不斷拜訪傳進的 Order 記憶體的下一個 Order(或透過陣列指標移動),並依商品類別計算折扣後金額,返回最後金額
-enum OrderPriority GetOrderPriority(Order *firstOrder) – 需不斷拜訪傳進的 Order 記憶體,依金額、顧客信用評分、運送天數判斷優先級,返回該優先級
-void CountPriority(Order *firstOrder, int n, int *high, int *medium, int *low, int *standard) – 需透過迴圈和指標拜訪所有 Order,統計每個優先級訂單數量
hint:
- 可以透過迴圈和指標不斷拜訪下一個 Order
- 可以透過判斷指標是否為 NULL(或迴圈計數到 n)來決定何時終止
- 可以透過 Order 結構體成員判斷折扣與優先級
function.c
Input
每筆訂單包含以下資料:
Name Type Amount ShippingDays CustomerRating
……
Name:商品名稱(字串,長度 ≤ 50)
Type:商品類別(整數,0=ELECTRONICS, 1=CLOTHING, 2=FOOD, 3=BOOK)
Amount:訂單金額(整數,0 ≤ Amount ≤ 20000)
ShippingDays:運送天數(整數,1 ≤ ShippingDays ≤ 30)
CustomerRating:顧客信用評分(整數,0 ≤ CustomerRating ≤ 100)
Note:
- 第一行輸入為訂單數量 N,接下來 N 行為訂單資料
- 不需處理輸入
Output
統計所有訂單的優先級數量,輸出格式如下:
HighPriority: x
MediumPriority: y
LowPriority: z
Standard: w
每筆訂單折扣後的最終金額:
Name final amount: value
若商品類別為 FOOD,最終金額需打 9 折
value 保留兩位小數
Note:
- 輸出的最後必須要有一個換行符號 (“\n”)
- 不需處理輸出