纠结的poj1573.。。

这个题写出来没用太多时间。。但是不知道怎么回事。。总是出现错误。。希望有时间的朋友们帮忙看看。。

题目大意以及思路我写的很清楚。。http://acm.pku.edu.cn/JudgeOnline/problem?id=1573原题。。

 

C语言: Codee#12514
//北京大学ACM  poj1573
//2010年8月3日
//题目大意:一个机器人在一个格子中行走。。可能有两种情况:机器人行走N个指令出去。。情况2:先行走N个指令。。然后在行走M个指令,,也就是转圈
//并且不会停下来了。。问题:输出的是哪一种情况
//我的思路:定义一个二维数组。。根据数组的行与列最终变化的值,来判断是哪一种的情况
//完成状况:已完成。
#include <stdio.h>
#define MAX 120
char Graph_Grid[MAX][MAX];
int Road_Grid[MAX*MAX][2];//用于记录机器人所走的路劲
void Case_Grid(int Row,int Rank,int n)
{
    int i,j;
    int k;
    int sign=0;//定义一个标记值,初始化为0;
    int lx=0,steps=0;
    i=1,j=n;//开始的时候初始化,让i等于第一行,让j等于所给数据中机器人的所处位置
    while(1)//用的是死循环。。意思是直到出去的时候才结束这个循环
    {
        if(Graph_Grid[i][j]=='N')
        {
            i--;
            Road_Grid[lx][0]=j;//就是记录路径的坐标情况
            Road_Grid[lx][1]=i;
            lx++;
        }
        else if(Graph_Grid[i][j]=='S')
        {
            i++;
            Road_Grid[lx][0]=j;
            Road_Grid[lx][1]=i;
            lx++;
        }
        else if(Graph_Grid[i][j]=='W')
        {
            j--;
            Road_Grid[lx][0]=j;
            Road_Grid[lx][1]=i;
            lx++;
        }
        else if(Graph_Grid[i][j]=='E')
        {
            j++;
            Road_Grid[lx][0]=j;
            Road_Grid[lx][1]=i;
            lx++;
        }
        if(i<1||i>Row||j<1||j>Rank)//第一种情况,如果是超出边界打印。。并且结束这个死循环。。
        {
            printf("%d step(s) to exit",lx);
            break;
        }
        //对于第二种情况,关键的思路是记录是否坐标发生过重复,如果发生过重复,我们可以相当然的认为它是构成了一个圈。。也就是死下去了
        for(k=0;k<lx-1;k++)//为什么是lx-1而不是lx;
        {
            if(Road_Grid[k][0]==j&&Road_Grid[k][1]==i)
            {
                steps=k;
                sign=1;
                break;
            }
        }
        if(sign==1)
        {
            printf("%d step(s) before a loop of %d step(s)",steps+1,lx-steps-1);//模拟一下。。可以理解数据
            break;
        }
    }
}
int main()
{
    int Row,Rank,n;
    int i,j;
    while(scanf("%d%d%d",&Row,&Rank,&n)!=EOF&&Row!=0,Rank!=0,n!=0)
    {
        getchar();
        memset(Graph_Grid,100,MAX*MAX);
        for(i=1;i<=Row;i++)
        {
            for(j=1;j<=Rank;j++)
            {
                scanf("%c",&Graph_Grid[i][j]);
            }
            getchar();//细节问题
        }
       
        Case_Grid(Row,Rank,n);
        printf("/n");
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值