标签:sid possible try chmod ima 方向 ret bsp 注意
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)
标签:sid possible try chmod ima 方向 ret bsp 注意
原文地址:http://www.cnblogs.com/clnchanpin/p/6915079.html