
3 6 5 NEESWE WWWESS SNWWWW 4 5 1 SESWE EESNW NWEEN EWSEN 0 0
10 step(s) to exit 3 step(s) before a loop of 8 step(s)
每个地图位置上都有一个方向,到达当前坐标,根据当前坐标的方向进行下一步的行走,给出起始位置,模拟机器人行走,可能会逃脱地图,输出步数,也可能会陷入死循环,也就是某个坐标位置第二次遇到,输出陷入循环前走的步数以及循环里面走的步数。模拟一下,判断是否有循环,到达坐标x,y的步数用step[x][y]存储,如果下一步是合法的行走(即没有越界,也没有重复访问),那么step[nextx][nexty]=step[x][y]+1,如果有循环,那么用单独一个变量duo来保存第二次到达某坐标位置所需要的步数,break掉。
代码:
#include <iostream>
#include <algorithm>
#include <string.h>
using namespace std;
const int maxn=110;
char map[maxn][maxn];
int step[maxn][maxn];//到达当前点走的步数
bool visit[maxn][maxn];//是否已经访问
int nextx,nexty;//下一个坐标位置
int n,m,p;//地图行列,开始位置的列数
bool loop;//判断走的路径是否出现环
int duo;//如果出现环,记录第二次走到该位置所需要的步数
bool escape(int x,int y)//判断是否逃出地图
{
if(x<1||x>n||y<1||y>m)
return true;
return false;
}
void input(int n,int m)
{
memset(step,0,sizeof(step));
memset(visit,0,sizeof(visit));
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
cin>>map[i][j];
}
void walk(int x,int y)//模拟行走
{
visit[x][y]=1;
while(1)
{
if(map[x][y]==‘E‘)//判断当前坐标方向,来确定下一个坐标位置
{
nextx=x;
nexty=y+1;
}
else if(map[x][y]==‘W‘)
{
nextx=x;
nexty=y-1;
}
else if(map[x][y]==‘N‘)
{
nextx=x-1;
nexty=y;
}
else
{
nextx=x+1;
nexty=y;
}
if(escape(nextx,nexty))//已经逃脱,则步数为step[x][y]+1,nextx,nexty为全局变量,无论是否能逃脱,最后输出步数用nextx,nexty做参数比较方便
{
nextx=x;
nexty=y;
break;
}
else if(visit[nextx][nexty])//第二次访问该位置
{
loop=1;//出现环
duo=step[x][y]+1;
break;
}
else//既没有逃脱地图,下一个位置也没有被访问
{
visit[nextx][nexty]=1;
step[nextx][nexty]=step[x][y]+1;//关键,下一个位置步数比前个位置步数多1
x=nextx;//这里是为了连接while循环,注意看while循环里面的第一条if语句
y=nexty;
}
}
}
int main()
{
while(cin>>n>>m>>p&&(n||m||p))
{
input(n,m);
loop=0;
walk(1,p);
if(!loop)//没有环
{
cout<<step[nextx][nexty]+1<<" step(s) to exit"<<endl;
}
else
cout<<step[nextx][nexty]<<" step(s) before a loop of "<<duo-step[nextx][nexty]<<" step(s)"<<endl;
}
return 0;
}
[ACM] hdu 1035 Robot Motion (模拟或DFS),布布扣,bubuko.com
[ACM] hdu 1035 Robot Motion (模拟或DFS)
原文地址:http://blog.csdn.net/sr_19930829/article/details/25687339