3291 - IP_2025_YOU_FIN Scoreboard

Time

2025/12/16 15:25:00 2025/12/16 19:00:00

Clarification

# Problem Asker Description Reply Replier Reply Time For all team

# Problem Pass Rate (passed user / total user)
14801 launch.json
14881 Walk Through The Map (Count)
14882 Matrix Max Rotate
14883 Bingo
14884 Order Ranker (with Critical Priority)

14801 - launch.json   

Description

{
    // Use IntelliSense to learn about possible attributes.
    // Hover to view descriptions of existing attributes.
    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Launch",
            "type": "cppdbg",
            "request": "launch",
            "preLaunchTask": "hwbuild",
            "program": "${fileDirname}\\${fileBasenameNoExtension}.exe",
            "args": [],
            "stopAtEntry": false,
            "cwd": "${fileDirname}",
            "environment": [],
            "externalConsole": true,
            "miDebuggerPath": "C:\\x86_64-15.2.0-release-posix-seh-msvcrt-rt_v13-rev0\\mingw64\\bin\\gdb.exe",
            "MIMode": "gdb"
        }
    ]
}

Input

Output

Sample Input  Download

Sample Output  Download

Tags




Discuss




14881 - Walk Through The Map (Count)   

Description

給定一個 5×5 的二維陣列 map 與一個長度為 10 的 enum 型別陣列。map 中的 'x' 代表玩家的位置,字元 '#' 代表障礙物,enum型別陣列中movement的每個元素代表接下來的移動方向。玩家將依序執行這 10 個移動指令,並更新最終位置,移動方向遇到障礙物時則不移動至該方向。

此外,在遇到障礙物時需輸出Hit obstacle at step X!(X為在第幾步遇到障礙物),遇到幾次障礙物就輸出幾次,並在最後輸出完地圖後,印出共遇到障礙物幾次,即Obstacle hits: N(N為撞到的次數)。

若結果為在界外,也請輸出在第幾步開始在界外,即Out of Boundary at step Z!(Z為開始在界外之步數)。

給定主要執行程式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) 傳入 5x5 的二維陣列 map 與指向 enum 陣列的指標。函式需找出玩家('x')的初始位置並依序執行 10 步移動指令:

-越界判斷:若移動後超出地圖範圍,請立即輸出 "Out of Boundary at step Z!"(Z 為當前步數,從 1 開始計算)並結束函式。

-障礙物判斷:若目標位置為障礙物('#'),則停留在原地,並輸出 "Hit obstacle at step X!"(X 為當前步數),同時累計撞牆次數。

-正常移動:若無上述情況,則更新玩家位置。

-最終輸出:若順利完成 10 步(未越界),請先印出最終的地圖狀態(不用空格分隔),最後換行印出總撞牆次數 "Obstacle hits: N"

 

hint:

可以透過movement++來取得enum陣列中的下一個元素

function.c

#include "function.h"
 
void mapMove(char map[5][5], enum Move *movement)
 
{
 
  // TO DO
 
}
 

Input

輸入符合以下格式

map

movement

 

Note:

  1. map代表地圖,為5*5的陣列,其中 ’x ’為人的所在位置,’#’為障礙物
  2. movement為一個由enum Move組成的陣列,長度為10(陣列中含10個enum元素)
  3. main.c 已處理輸入,不需自行處理

(詳見Sample Input)

 

Output

輸出符合以下格式:

移動距離在地圖內,且未碰到障礙物:(印出地圖以及人移動後的位置)

--#--

-----

--x--

---#-

-----

Obstacle hits: 0

 

若遇到障礙物:

Hit obstacle at step X!

...

Hit obstacle at step Y!

-----

-----

-x-#-

-----

-----

Obstacle hits: N

 

移動距離超過地圖:

Out of Boundary at step Z!

 

若遇到障礙物又超過地圖:

Hit obstacle at step X!

...

Hit obstacle at step Y!

Out of Boundary at step Z!

 

Note:

  1. 輸出的最後必須要有一個換行符號 ('\n'),地圖的字元間沒有空格
  2. X, Y, Z為遇到障礙物的步數,步數從1開始計算到10;N為碰到障礙物的次數
  3. 輸出部分需在mapMove() 中實作
 

Sample Input  Download

Sample Output  Download

Partial Judge Code

14881.c

Partial Judge Header

14881.h

Tags




Discuss




14882 - Matrix Max Rotate   

Description

給定一個大小為 N × M 的整數矩陣,請你進行以下運算:

 

步驟一:每一個 2×2 區塊取最大值

將矩陣從左到右、從上到下分成許多 不重疊的 2×2 區塊

每一個 2×2 區塊取出其中的 最大值

使用這些最大值組成一個新的矩陣並輸出

如果最右邊或最下面的格子無法組成完整的 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

Tags




Discuss




14883 - Bingo   

Description

大貓正在和小貓玩遊戲。

該遊戲是在一個6乘6的賓果棋盤格上,每個格子填上1到36的不重覆數字。

另外再從1到36中抽出N個不重覆的數字,這N個數字為中獎號碼。

在賓果棋盤格上,只要任一行、列、或對角線的六個數字都中獎,那就算一條成功連線。

如果某一行、列或對角線只差一個數字就連線成功,則算一條準連線。

請寫一個程式幫助大貓快速計算出一個棋盤格上的成功連線和準連線各為多少條。

 

Input

測試資料共有8行。

第1行為中獎號碼的數量N且1<=N<=36。

第2行為N個不重覆的中獎號碼,數字間以空格隔開。

第3行到第8行,每行共6個數字,每個數字以空格隔開,這五行五列的數字為一個賓果棋盤格。

 

Output

每筆測試資料的輸出只有一行,共兩個正整數,兩個數字以空格格開。

第一個數字表示賓果棋盤格共有多少成功的連線,第二個數字表示賓果棋盤格共有多少條準連線。

 

Note:

  1. 輸出的最後必須要有一個換行符號 (“\n”)

Sample Input  Download

Sample Output  Download

Tags




Discuss




14884 - Order Ranker (with Critical Priority)   

Description

電子商務系統中,每筆訂單都有三個屬性:

  • Amount(金額):訂單總價,範圍 0~20000
  • ShippingDays(運送天數):下單到到貨天數,範圍 1~30
  • CustomerRating(顧客信用評分):範圍 0~100

 

此外,系統對於訂單有折扣策略:

  • 食品類 (FOOD):9 折
  • 其他類別:原價

 

訂單分類如下:

  • HighPriority:高金額 (>=10000) 且 顧客評分高 (>=70) 且 快速運送 (<=3 天)
  • CriticalPriority:非高金額 (<10000) 但 要求極速運送 (<= 1 天)
  • MediumPriority:(高金額 (>=10000) 或 顧客評分高 (>=70)),且不符合上述優先級
  • LowPriority:低金額 (<10000) 且 顧客評分低 (<70) 且 慢速運送 (>7 天)
  • Standard:不屬於上述任何一類

 

給定主要執行程式main.c (題號.c)、以及Header檔function.h (題號.h);請試著完成Header檔中未實現的函式:SetOrderValue()、CalculateFinalAmount()、GetOrderPriority()、CountPriority()

 

function.h:

enum ProductType
{
    ELECTRONICS,
    CLOTHING,
    FOOD,
    BOOK
};
 
enum OrderPriority
{
    HighPriority,
    CriticalPriority,
    MediumPriority,
    LowPriority,
    Standard
};
 
typedef struct Order
{
    char name[50];         // 商品名稱
    enum ProductType type; // 商品類別
    int Amount;            // 訂單金額
    int ShippingDays;      // 運送天數
    int CustomerRating;    // 顧客信用評分
} Order;

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:

  1. 可以透過迴圈和指標不斷拜訪下一個 Order
  2. 可以透過判斷指標是否為 NULL(或迴圈計數到 n)來決定何時終止
  3. 可以透過 Order 結構體成員判斷折扣與優先級
 

function.c

#include "function.h"
 
 
 
// 設定單筆訂單資料
 
void SetOrderValue(Order *order, char *_name, enum ProductType _type, int _amount, int _days, int _rating)
 
{
 
    // TODO: 使用指標設定 Order 的各個欄位
 
}
 
 
 
// 計算折扣後金額
 
float CalculateFinalAmount(Order *firstOrder)
 
{
 
    // TODO: 透過指標拜訪 Order,判斷是否 FOOD 類折扣,返回最終金額
 
}
 
 
 
// 判斷單筆訂單優先級
 
enum OrderPriority GetOrderPriority(Order *firstOrder)
 
{
 
    // TODO: 透過指標拜訪 Order,依規則判斷並返回優先級
 
}
 
 
 
// 統計多筆訂單各優先級數量
 
CountPriority(Order *orders, int n, int *high, int *critical, int *medium, int *low, int *standard)
 
{
 
    // TODO: 透過指標迴圈拜訪所有訂單,累計各優先級數量
 
}
 

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:

  1. 第一行輸入為訂單數量 N,接下來 N 行為訂單資料
  2. 不需處理輸入
 

Output

統計所有訂單的優先級數量,輸出格式如下:

HighPriority: x

CriticalPriority: y

MediumPriority: z

LowPriority: n

Standard: m

 

每筆訂單折扣後的最終金額:

Name final amount: value

若商品類別為 FOOD,最終金額需打 9 折,value 保留兩位小數

 

Note:

  1. 輸出的最後必須要有一個換行符號 (“\n”)
  2. 不需處理輸出
 

Sample Input  Download

Sample Output  Download

Partial Judge Code

14884.c

Partial Judge Header

14884.h

Tags




Discuss