zoukankan      html  css  js  c++  java
  • 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
    ",vis[x][y]);
            }
            else printf("%d step(s) before a loop of %d step(s)
    ",flag-1,vis[x][y]-flag+1);
    
        }
        return 0;
    }
  • 相关阅读:
    1066 Bash 游戏
    1070 Bash 游戏 V4
    codevs 2928 你缺什么
    分块、线段树练习
    Father Christmas flymouse
    codevs 2494 Vani和Cl2捉迷藏
    codevs 2144 砝码称重2
    国王游戏
    codevs 1664 清凉冷水
    2015ACM/ICPC亚洲区沈阳站 Pagodas
  • 原文地址:https://www.cnblogs.com/Fy1999/p/9369239.html
Copyright © 2011-2022 走看看