10167 - moocHW5a   

Description

以範例程式為基礎
再加上自己寫的程式碼完成任務
先來看需要哪些陣列和函數

#include 
#define MAP_SIZE 11
#define EXIT_ROW 5
#define EXIT_COL 10
#define NUM_CARS 10
#define WALL '#'
#define SPACE '.'
#define EXIT '='

/* #define ONLINE_JUDGE */

int map[MAP_SIZE][MAP_SIZE];
void map_reset(void);
void map_show(void);
int cars[NUM_CARS][4];
void cars_read(void);
void cars_put_on_map(void);

void list_moves(void);

map 是一個二維陣列
用來表示地圖的內容
map_reset() 的作用是清除地圖內容並且設定邊界和出口
map_show() 則是把 map 的內容顯示到螢幕上


cars 二維陣列記錄全部車子的座標
陣列的大小是 NUM_CARS 乘 4
用四個數字分別記錄每一輛車子的左上和右下位置
譬如 cars[5][0], cars[5][1], cars[5][2], car[5][3] 的值如果分別是 8, 6, 8, 9
代表車子目前水平佔據了地圖 (8, 6) 到 (8, 9) 的位置
也就是在 row 8上從 column 6 到 column 9 總共四個格子
最小的車子的大小是兩格
也就是至少會佔水平或垂直兩格

先將地圖用 map_reset() 清空
再用 cars_read() 和 cars_put_on_map() 讀入車子的座標並放上 map
然後用 map_show() 顯示出來
就會看到底下的狀態  (符號 f 的那輛車就是上面舉例的編號 5 的車子)
###########
#........g#
#..b.....g#
#..bcccc.g#
#..b...ijg#
#aabd..ijh=
#...d..ijh#
#...d..i.h#
#...d.ffff#
#eeeee....#
###########


需要自行完成的函數是
list_moves()
這個函數的功能是按照順序列出每一輛車子
朝向 右、下、左、上  四個方向分別能夠移動的距離
要注意車子子能前後開、不能側移 (水平的車只能水平移動、垂直的車只能垂直移動)
譬如編號 5 的車子 (符號 f) 可移動距離是 0 0 1 0
表示 向右不能動、向下不能動、向左能動 1 格、向上不能動

移動時如果碰到出口
直接將出口當作牆壁就行了
不要算入可移動距離內

關於輸出格式

在自己電腦上測試的階段
資料讀取來源是 cars.txt
地圖狀態會顯示在螢幕上
但是資料輸出則是在 output.txt
範例程式產生的 output.txt 內容都是 0
如果 list_moves() 寫對了
產生的 output.txt 內容應該要和 sample_output.txt 完全一樣
可以先自行比對看看
程式寫完之後

上傳至 Online Judge 前
記得要將/* #define ONLINE_JUDGE */ 的註解符號移除 (拿掉 /* 和 */)
讓它變成 

#define ONLINE_JUDGE

這樣就不會從 cars.txt 讀取資料
而是從 OJ 自訂的 standard input 讀取測資
並且不會在螢幕上畫出地圖內容
輸出資料也不會寫到 output.txt
而是寫到 OJ 自訂的 standard output
如此才能符合 OJ 需要判讀的輸出格式

 

Input

總共有 10 行
分別代表編號 0 到 編號 9 總共十輛車子的座標
用四個數字表示
四個數字的順序分別是是 左上角的 row column 和 右下角的 row column
每輛車子至少會佔兩格
 

Output

輸出格式也是 10 行
每一行都是用換行字元結尾
每一行會有四個數字
分別代表每輛車子朝四個方向能夠移動的距離
四個方向的順序是 右、下、左、上

要把出口當作牆壁看待
不要計入可移動距離
 

Sample Input  Download

Sample Output  Download

Tags




Discuss