解题报告_18/5/27_POJ_1573_0

转载自:https://blog.csdn.net/lyy289065406/article/details/6645434

#include<iostream>  
using namespace std;  
  
int main(void)  
{  
    int row,col,entry;  
    char grid[12][12];     //在规定大小的grid外部至少再定义一圈"门槛"以判断Robot是否离开了grid  (最大grid为10x10)  
  
    for(;;)  
    {  
        memset(grid,'O',sizeof(grid));     // 'O' 为大写字母O,意为 Out  
  
        /*Input*/  
  
        int i,j;  
  
        cin>>row>>col>>entry;  
        if(!(row && col && entry))break;  
  
        for(i=1;i<=row;i++)  
            for(j=1;j<=col;j++)  
                cin>>grid[i][j];  
  
            /*Judge Robot get out of the grid or starts a loop in the grid*/  
  
            int flag[12][12]={0};   //标记Robot经过某点的次数,当有一点为2则说明Robot陷入了以该点为loop起始点的循环  
            int count;  
            int r=1;  
            int c=entry;  
            for(count=0;;count++)  
            {  
                flag[r][c]++;  //注意顺序,先标记,再位移  
                if(grid[r][c]=='N')        // ↑  
                    r--;  
                else if(grid[r][c]=='S')   // ↓  
                    r++;  
                else if(grid[r][c]=='W')   // ←  
                    c--;  
                else if(grid[r][c]=='E')   // →  
                    c++;  
                else if(grid[r][c]=='O')        // Out  
                {  
                    cout<<count<<" step(s) to exit"<<endl;  
                    break;  
                }  
  
                if(flag[r][c]==2)         //loop  
                {  
                    row=r;           //标记Robot循环起止点  
                    col=c;  
                    int flg=1;  
                    for(r=1,c=entry,count=0;;count++)  
                    {  
                        if(r==row && c==col && flg==1)  //注意顺序,先寻找循环点再位移(避免Robot刚进入grid就陷入了循环的情况)  
                        {  
                            cout<<count<<" step(s) before a loop of ";        //输出进入循环前的步数  
                            count=0;  
                            flg++;  
                        }  
                        if(r==row && c==col && count!=0 && flg==2)  
                        {  
                            cout<<count<<" step(s)"<<endl;              //输出循环步数  
                            break;  
                        }  
                        if(grid[r][c]=='N')        // ↑  
                            r--;  
                        else if(grid[r][c]=='S')   // ↓  
                            r++;  
                        else if(grid[r][c]=='W')   // ←  
                            c--;  
                        else if(grid[r][c]=='E')   // →  
                            c++;  
                    }  
                    break;    //跳出count的for循环,不是跳出if(当然break也不能用于跳出if,这里的说明是为了避免误解)  
                }  
            }  
    }  
    return 0;  
}  

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值