POJ 1573 Robot Motion (经典模拟)

题目链接:http://poj.org/problem?id=1573

这是寒假的时候就做过的题了,经典的模拟,控制一个小人,根据地上的命令行走,问第几步走出去或者如果遇到了循环,问在第几步遇到了循环,这个循环有多少步。

 

不过再一次做WA了一回,原因是没有控制好边界

if (x < 0 || y < 0 || x >= n || y >= m)
{
    tf = 1;
    break;
}

 

中没有加等号,导致没有及时跳出。

不过有一组好玩的数据可以测这种情况

1 1 1
S


好了,这种简单模拟不多说。

代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>

int bj[12][12];
char MAP[12][12];

int main()
{
    int n,m,s;
    while (~scanf ("%d%d%d",&n,&m,&s) && (n || m || s))
    {
        memset (bj,0,sizeof (bj));
        memset (MAP,0,sizeof (MAP));
        int i,k;

        for (i = 0;i < n;i++)
            scanf ("%s",MAP[i]);

        int x = 0,y = s - 1;

        bj[x][y] = 1;
        int tf = 0,step = 0,tstep = 0;
        while (bj[x][y] != 3)
        {
            switch (MAP[x][y])
            {
            case 'N':
                x--;
                break;
            case 'S':
                x++;
                break;
            case 'E':
                y++;
                break;
            case 'W':
                y--;
                break;
            }

            step++;

            if (x < 0 || y < 0 || x >= n || y >= m)
            {
                tf = 1;
                break;
            }

            bj[x][y]++;

            if (bj[x][y] == 2)
                tstep++;
        }

        if (tf)
            printf ("%d step(s) to exit\n",step);
        else
            printf ("%d step(s) before a loop of %d step(s)\n",step - 2 * tstep,tstep);
    }

    return 0;
}


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值