3284 - IP_2025_YOU_FIN_PRACTICE Scoreboard

Time

2025/12/02 13:00: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)
14867 Matrix Max Rotate
14868 Best Gomoku Move
14869 Walk Through The Map
14870 Order Ranker

14867 - Matrix Max Rotate   

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




14868 - Best Gomoku Move   

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




14869 - Walk Through The Map   

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:

  1. 可以透過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--

---#-

-----

 

移動距離超過地圖:

Out of Boundary!

 

 

Note:

  1. 輸出的最後必須要有一個換行符號 ('\n')
  2. 輸出部分需在mapMove() 中實作

Sample Input  Download

Sample Output  Download

Partial Judge Code

14869.c

Partial Judge Header

14869.h


Discuss




14870 - Order Ranker   

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:

 

enum ProductType
{
    ELECTRONICS,
    CLOTHING,
    FOOD,
    BOOK
};
enum OrderPriority
{
    HighPriority,
    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,依規則判斷並返回優先級
}
 
// 統計多筆訂單各優先級數量
void CountPriority(Order *firstOrder, int n, int *high, 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

MediumPriority: y

LowPriority: z

Standard: w

 

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

Name final amount: value

若商品類別為 FOOD,最終金額需打 9 折

value 保留兩位小數

 

Note:

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

Sample Input  Download

Sample Output  Download

Partial Judge Code

14870.c

Partial Judge Header

14870.h


Discuss