POJ 1573 Robot Motion模拟

来源:互联网 发布:js 时间排序函数 编辑:程序博客网 时间:2024/06/05 02:59

   题目:http://poj.org/problem?id=1573

   题目大意:一个棋牌上布满了N,E,S,W指令,人从北边的一个初始列按照棋牌的指令开始移动。直到走出棋牌,或者出现循环为止。

                      N表示向北(上)移动一格,

                      E表示向东(右)移动一格,

                     S表示向南(下)移动一格,

                     W表示向西(左)移动一格

   分析:因为棋牌只有10*10,也就是最多只有100步而已,因此可以用模拟的算法。我们声明一个char的棋牌map用于记录指令,一个初始值为全0的棋牌用于记录走过的路径。进行模拟直到人走出棋牌或者发现path不为0了,证明出现了环。

   代码如下:

#include <stdio.h>#include<string.h>#define  ONLINEvoid online(){#ifdef ONLINE#elsefreopen("1573.in", "r", stdin);freopen("1573.out", "w", stdout);#endif}const int LEN = 11;int r, c, s;char map[LEN][LEN];int path[LEN][LEN];int steps, loops;//模拟void imitate(int x, int y, int s){if (x <=0 || x > r || y <= 0 || y > c){steps = s;loops = -1;return ;}if (path[x][y] != 0){steps = path[x][y]-1;loops = s - steps;return;}path[x][y] = s +1;if (map[x][y] == 'N'){imitate(x-1, y, path[x][y]);}else if (map[x][y] == 'S'){imitate(x+1,y, path[x][y]);}else if (map[x][y] == 'W'){imitate(x, y-1, path[x][y]);}else if (map[x][y] == 'E'){imitate(x, y+1, path[x][y]);}}//打印void print(){if (loops == -1){printf("%d step(s) to exit\n", steps);}elseprintf("%d step(s) before a loop of %d step(s)\n", steps, loops);}//读取数据void read(){while (true){scanf("%d%d%d\n", &r, &c, &s);if (r==0 && c == 0 && s == 0){break;}for(int i =1; i <= r; i ++){for (int j=1; j <= c; j ++){scanf("%c", &map[i][j]);}//end for jscanf("\n");}//end for i;memset(path, 0, LEN * LEN * sizeof(int));imitate(1, s, 0);print();}//end while }int main(){online();read();return 0;}
    运行结果如下:

1573Accepted176K0MSC++1423B2011-08-02 22:36:30

原创粉丝点击