| # | Problem | Pass Rate (passed user / total user) |
|---|---|---|
| 5501 | I2P_LAB01_1 |
|
| 5506 | I2P_LAB02_1 |
|
| 5510 | I2P_LAB02_2 |
|
| 5514 | I2P_LAB03_1 |
|
| 5518 | I2P_LAB03_2 |
|
| 5522 | I2P_LAB04_1 |
|
| 5526 | I2P_LAB04_2 |
|
| 5530 | I2P_LAB05_1 |
|
| 5534 | I2P_LAB05_2 |
|
| 5538 | I2P_LAB06_1 |
|
| 5542 | I2P_LAB06_2 |
|
| 5546 | I2P_LAB07_1 |
|
| 5550 | I2P_LAB08_1 |
|
| 5554 | I2P_LAB08_2 |
|
| 5558 | I2P_LAB09_1 |
|
| 5562 | I2P_LAB09_2 |
|
| 5566 | I2P_LAB10_1 |
|
| 5570 | I2P_LAB10_2 |
|
| 5574 | I2P_LAB11_1 |
|
| 5578 | I2P_LAB11_2 |
|
| 5582 | I2P_LAB12_1 |
|
| 5586 | I2P_LAB12_2 |
|
| 5590 | I2P_LAB13_2 |
|
Description
已知帕斯卡三角形中,第n列的第k個元素為
C(n, k) = 1, for k = 0 or k = n
C(n, k) = C(n-1, k-1) + C(n-1, k), for 0 < k < n
(對於每一個第n列,k的範圍為0~n)
給定某非負整數n
請從帕斯卡三角形的第n列依序印到第0列
在每個數字的後面加上空白,並在每列的最後加上換行
Input
小於等於30的非負整數n
Output
從帕斯卡三角形的第n列依序印到第0列
註: 三角形中的任一元素均不會超過231-1
Sample Input Download
Sample Output Download
Tags
Discuss
Description
已知兩矩陣A、B相乘規則如下:
若C = A x B
C(i, j) = Σ A(i, k) x B(k, j), for all pairs (i, j) in C
A為M1 x N1的矩陣
B為M2 x N2的矩陣
其中N1 = M2
請輸出A x B的結果
hint:
需要三層for迴圈
Input
M1 N1
A矩陣
M2 N2
B矩陣
矩陣內的元素均為-231~231-1的整數
M1、N1、M2、N2均為小於等於10的正整數
Output
A x B
請在每個數字的後面加上空白,並在每列的最後加上換行
矩陣內的元素均為-231~231-1的整數
Sample Input Download
Sample Output Download
Tags
Discuss
Description
請完成車子吃寶物的遊戲, 其中
map 是一個二維陣列
用來表示地圖的內容
map_reset() 的作用是清除地圖內容以及重設邊界
map_show() 則是把 map 的內容顯示到螢幕上
blocks 也是二維陣列
記錄磚牆的位置
會透過 blocks_read() 從input 中讀取位置資訊
然後用 blocks_put_on_map() 在地圖 map 裡面的對應位置放置磚牆
磚牆是固定的
車子前進時如果遇到磚牆會被擋住
jewels 二維陣列記錄寶物的位置
會藉由 jewels_read() 從檔案 input 中讀取位置資訊
然後用 jewels_put_on_map() 在地圖 map 裡面的對應位置放置寶物
車子只要碰到寶物就會撿起來 (包含寶物一開始就在車子下)
car 二維陣列記錄車子的外觀 @ @ 表示車頭方向
車子的起始位置是row: 3, column: 4 (車子最左上角的座標)
用來記錄車子目前位置的變數是 car_row 和 car_col
車子的方向則是由 car_direction 表示
我們可以用 0, 1, 2, 3 來分別代表車子朝向 右、下、左、上
所以如果 car_direction 的值等於 2 表示車子目前朝左
而遊戲一開始是初始成朝上
car_earnings 則是記錄撿到的寶物數量
需要自行完成的函數是
car_rotate90() 和 car_move()
car_rotate90() 要將 car 二維陣列順時鐘旋轉 90 度
並且更新 car_direction 的值 讓它符合目前方向
car_move() 則要將 car 依照目前方向
向前移動一格
在移動之前必須先判斷是否會被磚牆擋住
也不能超出 map 原本的外牆
移動之後
要將碰到的寶物撿起來 (撿走之後就沒了 不能重複撿)
車子的移動是根據input的指示
只有兩種動作
'R' 代表順時鐘旋轉九十度
'F' 代表前進一格
做完全部的動作之後
最後要輸出車子目前的狀態
#include#define MAP_SIZE 12 #define CAR_SIZE 3 int map[MAP_SIZE][MAP_SIZE]; void map_reset(void); void map_show(void); int blocks[MAP_SIZE][MAP_SIZE]; void blocks_read(void); void blocks_put_on_map(void); int jewels[MAP_SIZE][MAP_SIZE]; void jewels_read(void); void jewels_put_on_map(void); int car[CAR_SIZE][CAR_SIZE] = {{'@', 'O', '@'}, {'O', 'O', 'O'}, {'O', 'O', 'O'}}; int car_row = 3, car_col = 4; int car_direction = 3; int car_earnings; void car_rotate90(void); void car_put_on_map(void); void car_move(void); int main(void) { int ch; jewels_read(); blocks_read(); while ((ch=getchar()) != EOF) { if (ch=='R') { car_rotate90(); } if (ch=='F') { car_move(); } map_reset(); jewels_put_on_map(); blocks_put_on_map(); car_put_on_map(); /*可以利用map_show()把目前狀態印出來, 但上傳時記得拿掉*/ /*map_show();*/ } printf("%d\n", car_earnings); printf("%d %d\n", car_row, car_col); char dirs[] = "RDLU"; printf("%c\n", dirs[car_direction]); return 0; } void blocks_read(void) { int n, i; int row, col; scanf("%d", &n); for (i=0; i Input
jewels個數
jewels位置
blocks個數
blocks位置
車子移動動作的序列
Output
最終得分
車子最終位置
車子最終方向
Sample Input Download
Sample Output Download
Tags
Discuss
Description
請完成車子吃寶物的遊戲, 其中
map 是一個二維陣列
用來表示地圖的內容
地圖的大小為12x12
map_reset() 的作用是清除地圖內容以及重設邊界
map_show() 則是把 map 的內容顯示到螢幕上
blocks 也是二維陣列
記錄磚牆的位置
會透過 blocks_read() 從input 中讀取位置資訊
然後用 blocks_put_on_map() 在地圖 map 裡面的對應位置放置磚牆
磚牆是固定的
車子前進時如果遇到磚牆會被擋住
jewels 二維陣列記錄寶物的位置
會藉由 jewels_read() 從檔案 input 中讀取位置資訊
然後用 jewels_put_on_map() 在地圖 map 裡面的對應位置放置寶物
車子只要碰到寶物就會撿起來 (包含寶物一開始就在車子下)
car 二維陣列記錄車子的外觀 @ @ 表示車頭方向
車子的大小為4x4
車子的起始位置是row: 3, column: 4 (車子最左上角的座標)
用來記錄車子目前位置的變數是 car_row 和 car_col
車子的方向則是由 car_direction 表示
我們可以用 0, 1, 2, 3 來分別代表車子朝向 右、下、左、上
所以如果 car_direction 的值等於 2 表示車子目前朝左
而遊戲一開始是初始成朝上
car_earnings 則是記錄撿到的寶物數量
需要自行完成的函數是
car_rotate90() 和 car_move()
car_rotate90() 要將 car 二維陣列逆時鐘旋轉 90 度
並且更新 car_direction 的值 讓它符合目前方向
car_move() 則要將 car 依照目前方向
向前移動一格
在移動之前必須先判斷是否會被磚牆擋住
也不能超出 map 原本的外牆
移動之後
要將碰到的寶物撿起來 (撿走之後就沒了 不能重複撿)
車子的移動是根據input的指示
只有兩種動作
'L' 代表逆時鐘旋轉九十度
'F' 代表前進一格
做完全部的動作之後
最後要輸出車子目前的狀態
#include#define MAP_SIZE 12 #define CAR_SIZE 4 int map[MAP_SIZE][MAP_SIZE]; void map_reset(void); void map_show(void); int blocks[MAP_SIZE][MAP_SIZE]; void blocks_read(void); void blocks_put_on_map(void); int jewels[MAP_SIZE][MAP_SIZE]; void jewels_read(void); void jewels_put_on_map(void); int car[CAR_SIZE][CAR_SIZE] = {{'@', 'O', 'O', '@'}, {'O', 'O', 'O', 'O'}, {'O', 'O', 'O', 'O'}, {'O', 'O', 'O', 'O'}}; int car_row = 3, car_col = 4; int car_direction = 3; int car_earnings; void car_rotate90(void); void car_put_on_map(void); void car_move(void); int main(void) { int ch; jewels_read(); blocks_read(); while ((ch=getchar()) != EOF) { if (ch=='L') { car_rotate90(); } if (ch=='F') { car_move(); } map_reset(); jewels_put_on_map(); blocks_put_on_map(); car_put_on_map(); /*可以利用map_show()把目前狀態印出來, 但上傳時記得拿掉*/ /*map_show();*/ } printf("%d\n", car_earnings); printf("%d %d\n", car_row, car_col); char dirs[] = "RDLU"; printf("%c\n", dirs[car_direction]); return 0; } void blocks_read(void) { int n, i; int row, col; scanf("%d", &n); for (i=0; i Input
jewels個數
jewels位置
blocks個數
blocks位置
車子移動動作的序列
Output
最終得分
車子最終位置
車子最終方向
Sample Input Download
Sample Output Download
Tags
Discuss
Description
輸入 3x3 二維陣列代表地圖,其中包含 1 和 9 以及 0,例如
1 0 0
0 0 0
9 0 0
從數字 1 的位置開始走,只能往右下左上(R,D,L,U)四個方向移動,目標是要走過每個位置,而且每個位置只能走過一次,直到走到 9 的位置為止
你的程式要輸出YES / NO,代表 1 是否能夠走到 9
hint:
1. 可以把 map 開大一點,int map[5][5]; 但是最好是先把內容填成 -1,讓外緣一圈邊界的值都是 -1,這樣可以區別 0 和 -1。此外走過之後的位置也要填上適當的整數值。
2. 建議可以嘗試隨機的方法,概念如下:
從 1 的位置開始,隨機選擇 4 個方向中任一個,如果可以走,就移到新的位置,並且在地圖上將該位置標記為 2,
然後繼續進行同樣的隨機動作,找尋可以標為 3 的位置。如果隨機選定的方向不能走 (超出地圖或是已經走過),
就在原來的位置重新再隨機挑選方向。
假如上述的隨機嘗試經過 10 次之後都失敗 (移動不了),就將全部的狀態還原,回到 1 的位置重新開始。
假如從 1 開始走,走到失敗之後重設為原始狀態,這樣的情況經歷了一百萬次還是走不到 9,就讓程式結束並且輸出 No.
底下是模擬丟骰子的程式碼:
#include#include int main(void) { int i, x; for (i=0; i<100; i++) { x = rand()%6 + 1; printf("%3d", x); } return 0; }
Input
N
地圖1
地圖2
...
地圖N
N代表有幾組地圖
Output
YES / NO
YES / NO
...
YES / NO
總共有N筆答案
每筆答案的後面請加上換行
並且注意字母全部為大寫
Sample Input Download
Sample Output Download
Tags
Discuss
Description
輸入 3x3 二維陣列代表地圖,其中包含 1 和 M 以及 0,例如
1 0 0
0 0 0
M 0 0
從數字 1 的位置開始走,只能往右下左上(R,D,L,U)四個方向移動,目標是要走過M個位置,而且每個位置只能走過一次,直到走到 M 為止
你的程式要輸出YES / NO,代表 1 是否能夠走到 M
hint:
1. 可以把 map 開大一點,int map[5][5]; 但是最好是先把內容填成 -1,讓外緣一圈邊界的值都是 -1,這樣可以區別 0 和 -1。此外走過之後的位置也要填上適當的整數值。
2. 建議可以嘗試隨機的方法,概念如下:
從 1 的位置開始,隨機選擇 4 個方向中任一個,如果可以走,就移到新的位置,並且在地圖上將該位置標記為 2,
然後繼續進行同樣的隨機動作,找尋可以標為 3 的位置。如果隨機選定的方向不能走 (超出地圖或是已經走過),
就在原來的位置重新再隨機挑選方向。
假如上述的隨機嘗試經過 10 次之後都失敗 (移動不了),就將全部的狀態還原,回到 1 的位置重新開始。
假如從 1 開始走,走到失敗之後重設為原始狀態,這樣的情況經歷了一百萬次還是走不到 M,就讓程式結束並且輸出 No.
底下是模擬丟骰子的程式碼:
#include#include int main(void) { int i, x; for (i=0; i<100; i++) { x = rand()%6 + 1; printf("%3d", x); } return 0; }
Input
N
M1
地圖1
M2
地圖2
...
MN
地圖N
N代表有幾組地圖
1 < Mi < 10, for i=1, 2, ..., N
Output
YES / NO
YES / NO
...
YES / NO
總共有N筆答案
每筆答案的後面請加上換行
並注意字母全部為大寫
Sample Input Download
Sample Output Download
Tags
Discuss
Description
將N個皇后放在西洋棋棋盤上
棋盤中任何橫列、直行、以及斜線都只能有一個皇后
請修改範例程式
算出有幾種放置方式
若無解則答案為0
hint:
#include#define MAX 12 /* q[i] 記錄的是在第 i 列 (row) 出現的皇后,要擺在第幾行 (column) */ /* 譬如,q[] 的內容如果是 {2, 0, 3, 1},表示四個皇后分別放在棋盤的 (0,2), (1,0), (2,3), (3,1) 四個位置 */ int q[MAX] = {0}; int N; void place(int row); int valid(int row, int col); int main(void) { scanf("%d", &N); place(0); /* printf(???); */ return 0; } /* 判斷目前的狀況下,如果在 row, col 位置放入新的皇后 是否會和之前的皇后衝突 如果是合法的放置方式 return 1; 如果有衝突 return 0; */ int valid(int row, int col) { int i; for (i=0; i<=row-1; i++) { /* if ( ??? ) return 0; */ } return 1; } void place(int row) { int j; if (row == N) { /* ??? */ } else { for (j=0; j Input
N
N為1~12的正整數
Output
有幾種擺法
(不須加換行)
Sample Input Download
Sample Output Download
Tags
Discuss
Description
把讀取到的資料儲存在整數陣列 data 裏面。 (不要排序,按照原始資料順序存放即可。)
撰寫程式找出陣列裏哪個區間的資料值的總和最小,然後輸出其總和。
例如:
資料是 {3, -5, -1, 10, -4, 5, -3},程式要輸出 -6,
因為總和最小的區間是從 index 1 到 index 2 (index 從 0 開始),也就是 -5 -1,這樣加起來是 -6 (=-5+-1),
而其他區間內的資料總和都大於 -6。譬如區間 [2, 3] 總和是 9 (=-1+10),區間 [0, 3] 總和為 7 (=3-5-1+10)。
Input
資料長度
資料序列
資料序列為整數型態且資料長度不超過100筆。
Output
輸出該陣列區間最小總和。
注意: 區間長度最小為1
e.g.
資料是 {-10, 1, 2, 3, 4}
要輸出-10,因為index 0~index 0也算一個區間
Sample Input Download
Sample Output Download
Tags
Discuss
Description
給定一些不同的整數
請將這些整數由小到大排序好
並依序輸出其 index
其中 index 為每個數字被讀進來時的順序
hint:
可以利用 Bubble sort 做排序。
主要的概念就是不斷地把陣列相鄰的元素拿來比較,如果大小順序不對,就用 swap 的方式把兩個元素交換。
就像水裡的泡泡浮上來的過程,比較大的數會不斷往後跑,因此最後整個陣列就會由小排到大。
Input
N
元素1 元素2 ... 元素N
N為1~100的正整數
Output
index第1小的元素 index第2小的元素 ... index第N小的元素
注意: index 的範圍為 1~N
請在每個 indexi 的後面加上空白
最後不需加上換行
Sample Input Download
Sample Output Download
Tags
Discuss
Description
小智在火箭隊的地下基地裡遇到了迷宮.
迷宮裡每個 entry 上都有東南西北的方向, 表示要往哪個方向移動到下一個 entry.
那麼給定小智走進迷宮的起始位置, 小智走迷宮會有兩種狀況:
1. 跟著每個 entry 的方向走, 最後走出迷宮.
2. 跟著每個 entry 的方向走, 最後一直在裡面兜圈子.
假設小智站在迷宮北方選擇一個 column 走進迷宮,
請問小智最後有沒有走出迷宮?
如果有, 請印出小智走過 N 個 entry.
如果沒有, 請印出小智走過 A 個 entry 後踏入循環路線, 並印出循環路線的總長為 B 個 entry.
例如:

Grid1: N為10
Grid2: A為3, B為8
hint:
1. 假設讀進來 map 大小為 (row, col), 可以開一個大小為 (row+2, col+2) 的 map, 外面一圈填上 -1, 裡面放讀到的 map.
這樣有助於判斷什麼時候走到地圖外 (走到 -1 就是走到原本的地圖外)
2. 可以印出地圖檢查自己每一步有沒有走對, 或檢查讀地圖有沒有讀對
3. 另外開一個 (row+2, col+2) 的 array 裡面都是 0, 當走到某個位置 (x, y) 就在 array 的 (x, y) 位置紀錄目前已經走過幾個 entry.
這樣有助於判斷循環路線有多長, 因為只要遇到 array 裡不是 0 的地方就表示以下兩點皆成立:
(1) 這個位置走過了
(2) 這個位置是循環路線的起點, 把你現在走過的 entry 數減去這個位置的 entry 數能算出循環路線的長度
Input
Grid的row數 Grid的column數 小智從哪個column走進迷宮
迷宮
註: 迷宮大小不超過10x10, 最小為2x2
Output
N
或
A B
註: 最後不需加上換行
Sample Input Download
Sample Output Download
Tags
Discuss
Description
喵喵想抓在迷宮裡的皮卡丘.
迷宮裡每個 entry 上都有東南西北的方向, 表示要往哪個方向移動到下一個 entry.
那麼給定喵喵走進迷宮的起始位置, 喵喵走迷宮會有三種狀況:
跟著每個 entry 的方向走, 最後
1. 走出迷宮.
2. 一直在裡面兜圈子.
3. 找到皮卡丘.
假設喵喵站在迷宮北方選擇一個 column 走進迷宮,
請問喵喵最後有沒有抓到皮卡丘?
如果沒有抓到皮卡丘最後走出迷宮, 請印出喵喵走過 E 個 entry.
如果沒有抓到皮卡丘也沒能走出迷宮, 請印出喵喵走過 A 個 entry 後踏入循環路線, 並印出循環路線的總長為 B 個 entry.
如果抓到皮卡丘, 請印出喵喵找到皮卡丘之前走過 D 個 entry, 並且後面加上字串pika.
例如:
.png)
Map1: E為10
Map2: A為3, B為8
Map3: D為10
hint:
1. 假設讀進來 map 大小為 (row, col), 可以開一個大小為 (row+2, col+2) 的 map, 外面一圈填上 -1, 裡面放讀到的 map.
這樣有助於判斷什麼時候走到地圖外 (走到 -1 就是走到原本的地圖外)
2. 可以印出地圖檢查自己每一步有沒有走對, 或檢查讀地圖有沒有讀對
3. 另外開一個 (row+2, col+2) 的 array 裡面都是 0, 當走到某個位置 (x, y) 就在 array 的 (x, y) 位置紀錄目前已經走過幾個 entry.
這樣有助於判斷循環路線有多長, 因為只要遇到 array 裡不是 0 的地方就表示以下兩點皆成立:
(1) 這個位置走過了
(2) 這個位置是循環路線的起點, 把你現在走過的 entry 數減去這個位置的 entry 數能算出循環路線的長度
Input
Map的row數 Map的column數 喵喵從哪個column走進迷宮
迷宮
註: 迷宮大小不超過10x10, 最小為2x2
P 為皮卡丘的位置
Output
E
或
A B
或
D pika
註: 最後不需加上換行
Sample Input Download
Sample Output Download
Tags
Discuss
Description
給定一個大小為 N x N 的地圖
每個entry的內容為0或1
可以對地圖做以下四種指令
L: 逆時針旋轉90度
R: 順時針旋轉90度
U: 放大兩倍 (每個entry會複製成4份)
F: 左右翻轉
例如:
010
100
100
左右翻轉完後為
010
001
001
再順時針轉90度為
000
001
110
再做一次放大後為
000000
000000
000011
000011
111100
111100
給定一串執行的指令
請將最後的地圖印出
Input
地圖
指令
註: N為小於10的正整數
指令的個數至少為1
Output
地圖最後的樣子
註: 地圖最後的大小不超過32x32
請在每一列的最後加上換行
Sample Input Download
Sample Output Download
Tags
Discuss
Description
對於兩個字元群,每種字母數目相同就算同個字元群,
如 abb 與 bab,視為同字元群,
輸入 N 個字元群,
每個字元群間用換行隔開,
請找出出現最少次的字元群,
並將次數印出。
hint:
Input
N
字元群1
字元群2
...
字元群N
每個字元群由3個字母組成,1<=N<=100
Output
最少出現字元群之出現次數
註: 最後不須加上換行
Sample Input Download
Sample Output Download
Tags
Discuss
Description
如 abb 與 bab,視為同字元群,
abB 與 bAb,視為同字元群,
abb 與 aaB,也視為不同字元群。
輸入 N 個字元群,
每個字元群間用換行隔開,
請找出出現最少次的字元群,
並將次數印出。
hint:
2. A 的 ASCII code 是 65, a 的 ASCII code 是 97。
Input
N
字元群1
字元群2
...
字元群N
每個字元群由3個字母組成,1<=N<=100
Output
最少出現字元群之出現次數
註: 最後不須加上換行
Sample Input Download
Sample Output Download
Tags
Discuss
Description
輸入多筆產品資料,包括產品名稱、價格、賣家評價,
以及一個搜尋產品名稱的字串,搜尋字串只會包含產品名稱的開頭字母。
請找出所有名稱開頭相符的產品(大小寫有區別),並印出產品的詳細資料。
順序由低價到高價,若價格相同,則依照賣家評價,由高到低排序。
假設查詢後都至少會有一個結果。
註:
如果出現TLE請試著用qsort來改善程式的執行速度。
hint:
1. 可以用struct把產品名稱、產品價錢與賣家評價包起來,然後針對struct裡的產品名稱做排序,最後將搜尋到的結果再針對價錢跟評價排序。
2. 如果用fgets吃字串,請先確認你吃進來的產品名稱與搜尋字串是對的。
Input
產品資料筆數 n (0 < n <= 16000)
接下來 3n 行關於產品的描述,每一個產品描述有 3 行:
產品名稱(不超過18個字元的字串)
產品價格(整數)
賣家評價(浮點數)
查詢字串(不超過18個字元)
註: 最後有換行
Output
查詢到的產品,一行一個產品,格式為:
產品名稱, NT$產品價格, 評價
註: 最後須換行
Sample Input Download
Sample Output Download
Tags
Discuss
Description
給定一個由英文字串組成的字典
請在裡面搜尋由指定的字首開頭的單字
並以字典排序的順序印出,
若沒有符合的單字,則印出None
註:
單字全部皆為小寫
給定的字典不一定已經排序
Hint:
1.比對字串可使用strncmp http://www.cplusplus.com/reference/cstring/strncmp/
2.若發生TLE,請改進sort或search方法
3.請注意,OJ在測試時是有限制記憶體使用量。
4.若發生 Memory Limit Exceeded,表示超過記憶體限制量,請改變記憶體配置方式 ( 使用動態方式配置單字長度或字典大小 )
( 顯示SIGSEGV,也可能是因為上述問題所致,請照上述建議方向或減少程式記憶體使用量對code做修改 )
Input
N
單字1
...
單字N
M
字首1
...
字首M
註:
單字最長不超過1000個字母,
1 <= N <= 100000
1 <= M <= 500
Output
搜尋到的所有符合字首的單字
若沒有符合的單字,則印出None
註: 最後須換行
Sample Input Download
Sample Output Download
Tags
Discuss
Description
■ ■ ■
Input
N
二維陣列1
二維陣列1
...
二維陣列N
Output
最高分數1
最高分數2
...
最高分數N
註: 最後須換行