【POJ - 1573】Robot Motion(dfs)

-->Robot Motion

直接中文

Descriptions:

样例1

样例2

有一个N*M的区域,机器人从第一行的第几列进入,该区域全部由'N' , 'S' , 'W' , 'E' ,走到某个区域的时候只能按照该区域指定的方向进行下一步,问你机器人能否走出该片区域,若不能,输入开始绕圈的步数和圈的大小。操作指令如下: 

N 向上 
S 向下 
E 向右 
W 向左 

例如,假设机器人从网格1的北(顶)侧开始,从南(下)开始。机器人所遵循的路径如图所示。在离开网格之前,机器人在网格中执行10条指令。 

比较网格2中发生的情况:机器人仅通过3条指令,然后通过8条指令开始循环,并且永不退出。 

您将编写一个程序来确定机器人离开网格所需的时间或机器人如何循环。 

Input

第一行是由空格分隔的三个整数:网格中的行数,网格中的列数以及机器人从北方进入的列数。 然后是方向指令的行。 每个网格将至少有一行,最多10行和一些指令。 指令行仅包含字符N,S,E或W,没有空格。 输入的结尾由包含0 0 0的行指示。

Output

对于每组输入,有一行输出。 机器人遵循一定数量的指令并在四边中的任何一个上退出网格,否则机器人遵循一定数量的位置上的指令,然后重复指示某些位置上的指令。 下面的示例输入对应于上面的两个网格,并说明了两种输出形式。“step”一词后面紧跟“(s)”,无论后面的数字是否为1。

Sample Input

3 6 5
NEESWE
WWWESS
SNWWWW
4 5 1
SESWE
EESNW
NWEEN
EWSEN
0 0 0

Sample Output

10 step(s) to exit
3 step(s) before a loop of 8 step(s)

题目链接

https://vjudge.net/problem/POJ-1573

 

没啥说的,直接dfs搜就行

 

AC代码

#include <iostream>
#include <cstdio>
#include <fstream>
#include <algorithm>
#include <cmath>
#include <deque>
#include <vector>
#include <queue>
#include <string>
#include <cstring>
#include <map>
#include <stack>
#include <set>
#include <sstream>
#define mod 1000000007
#define eps 1e-6
#define ll long long
#define INF 0x3f3f3f3f
#define MEM(x,y) memset(x,y,sizeof(x))
#define Maxn 25
using namespace std;
int r,c,s;//行,列,从第s列开始
char mp[Maxn][Maxn];//地图
int vis[Maxn][Maxn];//标记是否走过
int step[Maxn][Maxn];//(x,y)是第几步

//(x,y)  下一步的字母标志   到(x,y)已是第step步
void dfs(int x,int y,char op,int start)
{
    //走出迷宫
    if(mp[x][y]=='X'||x<1&&y<1&&x>r&&y>c)
        cout<<start<<" step(s) to exit"<<endl;
    //(x,y)没走过
    else if(!vis[x][y])
    {
        vis[x][y]=1;
        step[x][y]=start+1;
        //四种走法
        if(op=='N')
            return dfs(x-1,y,mp[x-1][y],step[x][y]);
        if(op=='S')
            return dfs(x+1,y,mp[x+1][y],step[x][y]);
        if(op=='E')
            return dfs(x,y+1,mp[x][y+1],step[x][y]);
        if(op=='W')
            return dfs(x,y-1,mp[x][y-1],step[x][y]);
    }
    //(x,y)走过,输出即可
    else if(vis)
        cout<<step[x][y]-1<<" step(s) before a loop of "<<start+1-step[x][y]<<" step(s)"<<endl;
}
int main()
{
    while(cin>>r>>c>>s,r+c+s)
    {
        //初始化
        MEM(mp,'X');
        MEM(vis,0);
        MEM(step,0);
        for(int i=1; i<=r; i++)
            for(int j=1; j<=c; j++)
                cin>>mp[i][j];
        step[1][s]=0;
        dfs(1,s,mp[1][s],step[1][s]);
    }
}

 

转载于:https://www.cnblogs.com/sky-stars/p/11204430.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值