poj2632 Crashing Robots


第一次WA了,倒不是因为答案错了,而是没等输入结束就输出结果,剩下没输入的数据就不高兴了(>﹏<)。

第二次runtime error,因为当时数组只设了100个(题目提供的test case<=100,所以设为100本来应该恰好足够的),但是for循环的时候从1开始循环100次就会遇到“r[100]”的情况,此时数组越界!w(゚Д゚)w            所以为了保险下一次还是设数组为r[105]吧。

今天第一次用这个输入输出数据( ﹁ ﹁ ) ~→

freopen("D:\input.txt","r",stdin);
freopen("D:\output.txt","w",stdout);

还挺好用的。。。

关于题目中遇到的问题:1.robot移动的过程中,每走一步都可能会crash到别的robot,所以每走一步都要检查一下是否发生了crashing。    2.用结构体储存多个robots的状态(位置和前进方向)。

#include <iostream>
#include <cstdio>
using namespace std;
int rob;
int length,width;
bool flag;

struct robots
{
    int xi,yi;
    char towards;
}r[105];

bool judge_border(int i)           //判断是否出界
{
    if(1<=r[i].xi&&r[i].xi<=length&&1<=r[i].yi&&r[i].yi<=width)
       return false;
    else
       return true;
}

int judge_crash(int i)          //判断是否发生碰撞
{
    int n;
    for (n=1;n<=rob;n++)
    {
        if(i!=n)
        {
            if(r[i].xi==r[n].xi&&r[i].yi==r[n].yi)
              return n;
        }
    }
    return 0;
}

void turn_left(int i,int times)        //向左转的情况
{
    int n;
    for(n=0;n<times;n++)
    {
        switch(r[i].towards)
        {
            case 'E':r[i].towards='N';
                break;
            case 'S':r[i].towards='E';
                break;
            case 'W':r[i].towards='S';
                break;
            case 'N':r[i].towards='W';
                break;
        }
    }
}

void turn_right(int i,int times)        //向右转的情况
{
    int n;
    for(n=0;n<times;n++)
    {
        switch(r[i].towards)
        {
            case 'E':r[i].towards='S';
                break;
            case 'S':r[i].towards='W';
                break;
            case 'W':r[i].towards='N';
                break;
            case 'N':r[i].towards='E';
                break;
        }
    }
}

void go_straight(int i,int times)       //向前走
{
    int n;
    int iscrash;
    for(n=0;n<times;n++)
    {
        switch(r[i].towards)
        {
            case 'E':r[i].xi+=1;
                break;
            case 'W':r[i].xi-=1;
                break;
            case 'S':r[i].yi-=1;
                break;
            case 'N':r[i].yi+=1;
                break;
        }
        if(judge_crash(i))
        {
            iscrash=judge_crash(i);
            cout<<"Robot "<<i<<" crashes into robot "<<iscrash<<endl;  //<span style="font-family: Arial, Helvetica, sans-serif;">由于三种不同的输出结果是平行的,且不在同一个代码段进行判断,所以使用flag标记</span>
            flag=false;
            break;
        }
    }
    if(flag)
    {
        if(judge_border(i))
        {
            cout<<"Robot "<<i<<" crashes into the wall"<<endl;
            flag=false;                                          //由于三种不同的输出结果是平行的,且不在同一个代码段进行判断,所以使用flag标记
        }
    }
}

void move(int i,char order,int times)       //判断命令的属性
{
    switch(order)
    {
        case 'L':turn_left(i,times);
                 break;
        case 'R':turn_right(i,times);
                 break;
        case 'F':go_straight(i,times);
                 break;
    }
}

int main()
{
    //freopen("D:\input.txt","r",stdin);
    //freopen("D:\output.txt","w",stdout);
    int n,i,j,act;
    int num[105],times[105];
    char order[105];
    cin>>n;
    while(n--)
    {
        cin>>length>>width;
        cin>>rob>>act;
        for(i=1;i<=rob;i++)
        {
            cin>>r[i].xi>>r[i].yi>>r[i].towards;
        }
        for(j=0;j<act;j++)
        {
            cin>>num[j]>>order[j]>>times[j];
        }                                     //不要急!输入结束后再输出结果
        for(j=0;j<act;j++)
        {
            flag=true;
            move(num[j],order[j],times[j]);
            if(!flag)
              break;
        }
        if(flag)
        {
               cout<<"OK"<<endl;
        }
    }
    return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值