当前位置: 代码迷 >> 综合 >> hdu-1035 Robot Motion (模拟)
  详细解决方案

hdu-1035 Robot Motion (模拟)

热度:64   发布时间:2023-11-23 02:11:48.0

       题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1035 

      题目大意:机器人在一个n*m大小的网格走,每个格子的值标识下一步往哪走(NSWE 对应 上下左右)。告诉你初始位置,判断机器人是否能走出网格,如果能走出网格输出走过的步数,不能则会陷入循环,输出走了多少步之后开始循环,和循环一圈的步数。

      题解:用二维字符串数组存网格数据,用二维Int数组存走到当前坐标走了多少步,用一个Int变量记录当前走了多少步,x,y表示当前坐标 从起始位置开始走,每走一步都给走过的位置赋值,如果该位置值不为0,说明之前走过机器人陷入循环,循环前走了当前位置步数- 1步,循环走了当前步数减去当前位置步数+1。 如果x或y在表格范围之外 输出当前步数即可。

 

      AC代码:

#include <iostream>
#include"string.h"
using namespace std;
int n,m,s;
char maze[15][15];
int Map[15][15];
int main(int argc, char** argv) {while(cin>>n>>m>>s){if(n == 0 && m == n && s == n)    break;memset(Map,0,sizeof(Map));for(int i = 1;i<=n;i++)for(int j = 1;j<=m;j++)cin>>maze[i][j];Map[1][s] == 0;int step = 0;int x = 1,y = s;while(1){if(!(x>=1 && x<=n && y>=1 && y<=m)){printf("%d step(s) to exit\n",step);break;}if(Map[x][y] != 0){printf("%d step(s) before a loop of %d step(s)\n",Map[x][y]-1,step - Map[x][y] +1);break;}step++;Map[x][y] = step;if(maze[x][y] == 'S')    x++;else if(maze[x][y] == 'N')    x--;else if(maze[x][y] == 'E')    y++;else if(maze[x][y] == 'W')    y--;}}return 0;
}

    小结:题目的难点主要在于如何判断是否进入循环,以及如何找到进入循环的前后的步数。  看其他很多人把这道题归类为dfs,但是感觉没用到dfs的知识,我把它归类为模拟题。