标签: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