2010-09-18 130 views
0

我應該只用C編寫程序。這是一個網格追隨者的代碼。Bot以相反順序排列網格

我已經定義了一個座標系(0-5,0-5)。還定義了機器人方向(+ y,-y,+ x,-x)和位置。 (我會歡迎有關如何爲此編寫好代碼的提示。)

現在,我的bot在網格中移動,並通過某個路徑轉到網格中的某個座標(x,y)。只允許90度和180度轉彎。

我該如何達到(0,0),即起始點,遍歷相同的路徑?如何反轉方向並使用C代碼提供適當的車削指令?

+2

正在做作業嗎? – t0mm13b 2010-09-18 21:13:49

+0

嗯......答案取決於你如何選擇*得到*在那裏擺在首位。如果你在水平方向移動,那麼垂直方向回到相同的路徑將需要在垂直方向移動,然後水平移動,不是嗎?所以... – dmckee 2010-09-18 21:22:50

+0

機器人如何從一個位置移動到另一個位置?請用**代碼**回答! – pmg 2010-09-18 21:32:51

回答

2

這可以清理很多,但它應該是理解概念的好框架。我們基本上所做的就是保存一切,然後簡單地回溯它。

#include <stdio.h> 

#define MAX_STEPS 256 

enum CARDINAL_DIRECTIONS { N = 0, W, S, E }; 

struct _s_robot { 
    int x; 
    int y; 
    int orientation; 
    int step; 
    int x_history[MAX_STEPS]; 
    int y_history[MAX_STEPS]; 
    int turn_history[MAX_STEPS]; 
} MY_LITTLE_ROBOT = {0, 0, 0, 0, {0}, {0}, {0}}; 

void robot_go() { 
    switch(MY_LITTLE_ROBOT.orientation) { 
    case N: 
     ++MY_LITTLE_ROBOT.y; 
     break; 
    case W: 
     --MY_LITTLE_ROBOT.x; 
     break; 
    case S: 
     --MY_LITTLE_ROBOT.y; 
     break; 
    case E: 
     ++MY_LITTLE_ROBOT.x; 
     break; 
    } 
    MY_LITTLE_ROBOT.x_history[MY_LITTLE_ROBOT.step] = MY_LITTLE_ROBOT.x; 
    MY_LITTLE_ROBOT.y_history[MY_LITTLE_ROBOT.step] = MY_LITTLE_ROBOT.y; 
    MY_LITTLE_ROBOT.turn_history[MY_LITTLE_ROBOT.step] = MY_LITTLE_ROBOT.orientation; 
    ++MY_LITTLE_ROBOT.step; 
} 

void robot_change_orientation(int _orientation) { 
    MY_LITTLE_ROBOT.orientation = _orientation; 
} 

void robot_reverse_orientation(int _orientation) { 
    if (_orientation == N) MY_LITTLE_ROBOT.orientation = S; 
    else if (_orientation == W) MY_LITTLE_ROBOT.orientation = E; 
    else if (_orientation == S) MY_LITTLE_ROBOT.orientation = N; 
    else if (_orientation == E) MY_LITTLE_ROBOT.orientation = W; 
} 

void robot_backtrack() { 
    int i; 
    printf("MY_LITTLE_ROBOT wants to turn around, currently at: %i, %i\n", MY_LITTLE_ROBOT.x, MY_LITTLE_ROBOT.y); 
    robot_reverse_orientation(MY_LITTLE_ROBOT.orientation); 
    for (i = MY_LITTLE_ROBOT.step-1; i >= 0; --i) { 
     printf("Robot is @ %i, %i, with an orientation of: %i \n", MY_LITTLE_ROBOT.x, MY_LITTLE_ROBOT.y, MY_LITTLE_ROBOT.orientation); 
     robot_reverse_orientation(MY_LITTLE_ROBOT.turn_history[i]); 
     robot_go(); 
    } 
} 

void dump_history() { 
    int i; 
    for (i = MY_LITTLE_ROBOT.step-1; i >= 0; --i) { 
     printf("Robot is @ %i, %i, with an orientation of: %i \n", MY_LITTLE_ROBOT.x_history[i], MY_LITTLE_ROBOT.y_history[i], MY_LITTLE_ROBOT.turn_history[i]); 
    } 
} 

int main() { 
    printf("***START: Robot is @ %i, %i\n", MY_LITTLE_ROBOT.x, MY_LITTLE_ROBOT.y); 
    robot_go(); 
    robot_go(); 
    robot_go(); 
    robot_change_orientation(S); 
    robot_go(); 
    robot_go(); 
    robot_change_orientation(W); 
    robot_go(); 
    robot_go(); 
    robot_go(); 
    robot_change_orientation(N); 
    robot_go(); 
    dump_history(); 
    robot_backtrack(); 
    printf("***FINISH: Robot is @ %i, %i\n", MY_LITTLE_ROBOT.x, MY_LITTLE_ROBOT.y); 
    return 0; 
} 

要通過使用機器人一遍又一遍,你可能有一個回溯,這應該是有點微不足道後重置所有的旅行史。我特意避免了malloc以及其他令人困惑的方面,使得該程序爲了冗長和簡單而實際上有用。希望它有幫助。

我也假設你不想要true路徑尋找算法(如A *),因爲這是一個不同的球賽。

+1

+1 LITTLE_CUTE_ROBOT的一個不錯的開始 – pmg 2010-09-18 23:21:51

+0

@ david ...非常感謝...!非常好的代碼結構...(至少對於像我這樣的初學者!:P) – Kaushal 2010-09-20 18:19:25