HDOJ HDU 1035 Robot Motion

来源:互联网 发布:淘宝客推广宣传海报 编辑:程序博客网 时间:2024/05/21 13:22

HDOJ 1035 Robot Motion

题目

点此查看 HDOJ 1035 Robot Motion

分类

dfs

题意

机器人走迷宫
输入三个数 n m r
表示 n*m的迷宫 机器人从(1,r)进入
此题不同在于 机器人遇到循环
出迷宫 输出 需要步数
进入循环 输出 循环步数 

题解

按题意dfs即可
但是在做 标记时要记录步数
再 重复遇到标记时 用当前步数 减去 循环位置记录的步数 即为循环步数

代码

#include <iostream>#include <cstring>#define max 100using namespace std;int r,c;char map[100][100];int vis[100][100];int dir[4][2] = {-1.0,0,1,1,0,0,-1};bool ext;int dfs(int x,int y,int & d);int main(){    int n,d,v;    while(cin >> r >> c && r && c)    {        memset(vis,0,sizeof(vis));        ext = false;        v = d = 1;        cin >> n;        for(int i = 0;i < r;i++)            for(int j = 0;j < c;j++)                cin >> map[i][j];        vis[0][n-1] = d;        v = dfs(0,n-1,d);        if(ext)            cout << d << " step(s) to exit" << endl;        else cout << v-1 << " step(s) before a loop of " << d-v+1 << " step(s)"<< endl;    }    return 0;}int dfs(int x,int y,int & d){    switch(map[x][y])    {        case 'N' : if(x-1 < 0)                    {                        ext = true;                        return d;                    }                    if(vis[x-1][y])                    {                        return vis[x-1][y];                    }d++;                    vis[x-1][y] = d;                    return dfs(x-1,y,d);                    break;        case 'S' : if(x+1 >= r)                    {                        ext = true;                        return d;                    }                    if(vis[x+1][y])                        return vis[x+1][y];                    d++;                    vis[x+1][y] = d;                    return dfs(x+1,y,d);                    break;        case 'W' : if(y-1 < 0)                    {                        ext = true;                        return d;                    }                    if(vis[x][y-1])                        return vis[x][y-1];                    d++;                    vis[x][y-1] = d;                    return dfs(x,y-1,d);                    break;        case 'E' : if(y+1 >= c)                    {                        ext = true;                        return d;                    }                    if(vis[x][y+1])                        return vis[x][y+1];                    d++;                    vis[x][y+1] = d;                    return dfs(x,y+1,d);                    break;    }    return 0;}