-->Robot Motion
直接中文
Descriptions:
样例1
样例2
有一个N*M的区域,机器人从第一行的第几列进入,该区域全部由'N' , 'S' , 'W' , 'E' ,走到某个区域的时候只能按照该区域指定的方向进行下一步,问你机器人能否走出该片区域,若不能,输入开始绕圈的步数和圈的大小。操作指令如下:
N 向上
S 向下
E 向右
W 向左
例如,假设机器人从网格1的北(顶)侧开始,从南(下)开始。机器人所遵循的路径如图所示。在离开网格之前,机器人在网格中执行10条指令。
比较网格2中发生的情况:机器人仅通过3条指令,然后通过8条指令开始循环,并且永不退出。
您将编写一个程序来确定机器人离开网格所需的时间或机器人如何循环。
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]); } }