2010年2月4日 星期四

Problem 118 Mutant Flatworld Explorers,機器人的移動

Problem 118 此題需要輸入一個矩形的大小,而給定機器人初始位置後,下一些指令使它轉動或移動,當它走出矩形之外就會消失,在消失之前,機器人會在此點上做「標記」,以防下一個機器人走到此點再次消失。

這題我一開始就先設計一個結構(struct),裡面紀錄 x 座標和 y 座標和它面向什麼方向,這有兩個地方會用到這個結構,一個是「機器人」,另一個是「標記」,如同以下程式碼:
#define MAX 100
struct Robots
{
int x;
int y;
char face;
};
struct Robots r;
struct Robots scent[MAX];

接著,機器人的動作我分成「轉動」和「移動」兩個部分,所以我分兩個函式去做它,在寫這些這兩個函式之前,需要先寫一個函式判斷機器人有沒有走出矩形之外,如同以下程式碼:
int isInSite (int x, int y)
{
// topX 和 topY 為右上角頂點。
if (topX >= x && x >= 0 && topY >= y && y >= 0)
return 1;
return 0;
}

主程式中,在讀入機器人指令為 'F' 則跳入 move() 函式;讀入指令不為 'F',則跳入 changeFace(char ch) 函式,以下為主程式區段程式碼:
gets(str);
for (i = 0; str[i];i ++)
{
if (!inSite) break;
if (str[i] == '\n') break;
if (str[i] == 'F') inSite = move();
else changeFace(str[i]);
}

以下為 move() 和 changeFace(char ch) 函式程式碼:
void changeFace (char ch)
{
if (ch == 'R')
if (r.face == 'N') r.face = 'E';
else if (r.face == 'E') r.face = 'S';
else if (r.face == 'S') r.face = 'W';
else r.face = 'N';
else
if (r.face == 'N') r.face = 'W';
else if (r.face == 'W') r.face = 'S';
else if (r.face == 'S') r.face = 'E';
else r.face = 'N';
}

int move ()
{
int i, isInScent = 0;
if (r.face == 'N') r.y ++;
else if (r.face == 'E') r.x ++;
else if (r.face == 'S') r.y --;
else r.x --;

if (isInSite(r.x, r.y))
return 1;
else
{
if (r.face == 'N') r.y --;
else if (r.face == 'E') r.x --;
else if (r.face == 'S') r.y ++;
else r.x ++;
for (i = 0; i < index; i ++)
if (scent[i].x == r.x && scent[i].y == r.y)
{
isInScent = 1;
break;
}
if (isInScent)
return 1;
else
{
scent[index].x = r.x, scent[index].y = r.y, index ++;
return 0;
}
}
}

如此一來,上傳後雖然有一些小錯誤,但修正後還是過了。

By David.K

p118題目連結
回ACM題庫目錄
回首頁

沒有留言: