poj1573 Robot Motion(模拟)

题意:在r行c列的地图中,机器人从第一行的start列开始出发,N,S,W,E分别表示北南西东四个方向,问机器人走出地图需要多少步,如果走不出地图,输出走到形成环状的步数以及形成环状路线的总步数。

思路:模拟机器人行走的过程,我是用了一个数组s存图,一个数组vis存步数,一开始地图上的步数都为0,当遇到步数不为0 的情况,说明形成了环状。

#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;

const int maxn=1010;

int n,m,k;
char s[maxn][maxn];
int vis[maxn][maxn];



int main()
{
    ios::sync_with_stdio(false);
    while(cin>>n>>m>>k&&(n!=0||m!=0||k!=0))
    {
        memset(s,0,sizeof(s));
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=m;j++)
                cin>>s[i][j];
        }
        memset(vis,0,sizeof(vis));
        int flag=-2;
        vis[1][k]=1;
        int x=1,y=k;
        while(1)
        {
            if(s[x][y]=='N')
            {
                if(x-1<1)
                    flag=-1;
                else if(vis[x-1][y]==0)
                {
                    vis[x-1][y]=vis[x][y]+1;
                    x--;
                }
                else flag=vis[x-1][y];
            }
            if(s[x][y]=='S')
            {
                if(x+1>n)
                    flag=-1;
                else if(vis[x+1][y]==0)
                {
                    vis[x+1][y]=vis[x][y]+1;
                    x++;
                }
                else flag=vis[x+1][y];
            }
            if(s[x][y]=='E')
            {
                if(y+1>m)
                    flag=-1;
                else if(vis[x][y+1]==0)
                {
                    vis[x][y+1]=vis[x][y]+1;
                    y++;
                }
                else flag=vis[x][y+1];
            }
            if(s[x][y]=='W')
            {
                 if(y-1<1)
                    flag=-1;
                else if(vis[x][y-1]==0)
                {
                    vis[x][y-1]=vis[x][y]+1;
                    y--;
                }
                else flag=vis[x][y-1];
            }
            if(flag!=-2){
                break;
            }

        }
        if(flag==-1)
        {
            printf("%d step(s) to exit\n",vis[x][y]);
        }
        else printf("%d step(s) before a loop of %d step(s)\n",flag-1,vis[x][y]-flag+1);

    }
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/Fy1999/p/9369239.html