poj -2632 Crashing Robots

poj -2632 Crashing Robots

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

http://poj.org/problem?id=2632

Crashing Robots
Time Limit: 1000MS   Memory Limit: 65536K
Total Submissions: 7470   Accepted: 3265

Description

In a modernized warehouse, robots are used to fetch the goods. Careful planning is needed to ensure that the robots reach their destinations without crashing into each other. Of course, all warehouses are rectangular, and all robots occupy a circular floor space with a diameter of 1 meter. Assume there are N robots, numbered from 1 through N. You will get to know the position and orientation of each robot, and all the instructions, which are carefully (and mindlessly) followed by the robots. Instructions are processed in the order they come. No two robots move simultaneously; a robot always completes its move before the next one starts moving.
 

A robot crashes with a wall if it attempts to move outside the area of the warehouse, and two robots crash with each other if they ever try to occupy the same spot.

Input

The first line of input is K, the number of test cases. Each test case starts with one line consisting of two integers, 1 <= A, B <= 100, giving the size of the warehouse in meters. A is the length in the EW-direction, and B in the NS-direction.
 

The second line contains two integers, 1 <= N, M <= 100, denoting the numbers of robots and instructions respectively.
 

Then follow N lines with two integers, 1 <= Xi <= A, 1 <= Yi <= B and one letter (N, S, E or W), giving the starting position and direction of each robot, in order from 1 through N. No two robots start at the same position.
 



poj -2632 Crashing Robots
 

Figure 1: The starting positions of the robots in the sample warehouse


Finally there are M lines, giving the instructions in sequential order.
 

An instruction has the following format:
 

< robot #> < action> < repeat>
 

Where
 is one of
 

  • L: turn left 90 degrees, 
  • R: turn right 90 degrees, or 
  • F: move forward one meter,

and 1 <= < repeat> <= 100 is the number of times the robot should perform this single move.

Output

Output one line for each test case:
 

  • Robot i crashes into the wall, if robot i crashes into a wall. (A robot crashes into a wall if Xi = 0, Xi = A + 1, Yi = 0 or Yi = B + 1.) 
  • Robot i crashes into robot j, if robots i and j crash, and i is the moving robot. 
  • OK, if no crashing occurs.

Only the first crash is to be reported.

Sample Input

4
5 4
2 2
1 1 E
5 4 W
1 F 7
2 F 7
5 4
2 4
1 1 E
5 4 W
1 F 3
2 F 1
1 L 1
1 F 3
5 4
2 2
1 1 E
5 4 W
1 L 96
1 F 2
5 4
2 3
1 1 E
5 4 W
1 F 4
1 L 1
1 F 20

Sample Output

Robot 1 crashes into the wall
Robot 1 crashes into robot 2
OK
Robot 1 crashes into robot 2

Source

 
//赤裸裸的模拟,開始有点卡,就是依照题意一步步来就好了,注意是假设碰撞就标记。仅仅推断第一次就好。
#include<cstdio>
#include<cstring>
struct point
{
    int x,y;
    char c;
}f[105];
struct node
{
    int x,y;
    char c;
}ff[105];
int a,b,n,m;
bool check(int k)  //推断函数,開始就是有点卡这里
{
    int i;
    if(f[k].x<=0||f[k].x>a||f[k].y<=0||f[k].y>b) //跟墙碰撞
    {
        printf("Robot %d crashes into the wall\n",k);
        return 1;
    }
    for(i=1;i<=n;i++)   //跟其他机器人碰撞
    {
        if(i==k) continue;
        if(f[k].x==f[i].x&&f[k].y==f[i].y)
        {
           printf("Robot %d crashes into robot %d\n",k,i);
           return 1;
        }
    }
    return 0;
}
int main()
{
    //freopen("a.txt","r",stdin);
    int t,i,j,l,k,flag;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d%d%d%d",&a,&b,&n,&m);
        for(i=1;i<=n;i++)
        {
            scanf("%d%d %c",&f[i].x,&f[i].y,&f[i].c);
            //printf("%d%d%c\n",f[i].x,f[i].y,f[i].c);
        }
        flag=0;
        for(i=1;i<=m;i++)
        {
            scanf("%d %c %d",&ff[i].x,&ff[i].c,&ff[i].y);
            //printf("%d%c%d\n",ff[i].x,ff[i].c,ff[i].y);
            //
            k=ff[i].x;
            if(ff[i].c=='L')
            {
                l=ff[i].y%4; //4个方向一个周期  看剩下多少步
                for(j=1;j<=l;j++)
                {
                    if(f[k].c=='N')
                        f[k].c='W';
                    else if(f[k].c=='E')
                        f[k].c='N';
                    else if(f[k].c=='S')
                        f[k].c='E';
                    else if(f[k].c=='W')
                        f[k].c='S';
                }
            }
            else if(ff[i].c=='R')  
            {
                l=ff[i].y%4; //同理
                for(j=1;j<=l;j++)
                {
                    if(f[k].c=='N')
                        f[k].c='E';
                    else if(f[k].c=='E')
                        f[k].c='S';
                    else if(f[k].c=='S')
                        f[k].c='W';
                    else if(f[k].c=='W')
                        f[k].c='N';
                }
            }
            else
            {
                l=ff[i].y;
                if(!flag)   //仅仅须要推断一次即可。
                {
                for(j=1;j<=l;j++)
                {
                    if(f[k].c=='N')
                    {
                        f[k].y++;
                        flag=check(k);
                        if(flag)break;
                    }
                    else if(f[k].c=='W')
                    {
                        f[k].x--;
                        flag=check(k);
                        if(flag)break;
                    }
                    else if(f[k].c=='S')
                    {
                        f[k].y--;
                        flag=check(k);
                        if(flag) break;
                    }
                    else if(f[k].c=='E')
                    {
                        f[k].x++;
                        flag=check(k);
                        if(flag)break;
                    }
                }
                }
            }
        }
        if(!flag) printf("OK\n");
    }
    return 0;
}

版权声明:本文博主原创文章,博客,未经同意不得转载。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/116827.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • vue双向数据绑定的原理「建议收藏」

    vue双向数据绑定的原理「建议收藏」有关双向数据绑定的原理最近两次面试的时候,被问到了vue中双向数据绑定的原理,因为初学不精,只是使用而没有深入研究,所以答不出来。之后就在网上查找了别人写的博客,学习一下。下面是博客园一篇博客,以及MDN上讲解Object.defineProperty()方法的地址。文章链接:vue的双向绑定原理及实现Mozilla开发者服务:Object.defineProperty…

    2022年10月17日
  • CentOS下mysql最大连接数设置 1040 too many connection

    CentOS下mysql最大连接数设置 1040 too many connection

    2021年12月6日
  • docker(10)上传本地镜像到镜像仓库[通俗易懂]

    docker(10)上传本地镜像到镜像仓库[通俗易懂]前言之前通过docker搭建过jenkins+python3环境,如果想要在不同的机器上搭建一样的环境,就可以将之前搭建的镜像上传到镜像仓库,这样方便在不同的机器上快速搭建同一套环境。如果公开的话

    2022年7月30日
  • icem合并面网格_ICEM CFD混合网格

    icem合并面网格_ICEM CFD混合网格ICEMCFD中合并多个网格对于结构十分复杂的几何模型,若能够将几何体分割成多个部分由多人分别进行网格划分,生成网格后能够对网格进行组装,这恐怕是很多人梦寐以求的功能了。其实很多前处理软件都具有此功能。今天要说的是如何在ICEMCFD中实现此功能。为了简单起见,这里用一个非常简单的模型进行演示。当然复杂的模型的处理方式也是相同的。我们要处理的几何模型如图1所示。一个L型整体块被切割成3份。分别…

    2022年5月24日
  • 中国成功发射第二颗北斗导航卫星,有感

    中国成功发射第二颗北斗导航卫星,有感首先,听到这个是心情很激动,觉得祖国离强国的距离又近一步。但又在想何时我想的卫星定位可以象GPS那样广范应用。我以前也做过几个相关项目,如果可以用自己国家的我一定会放弃GPS,为我国的3S发展出自己的一份力。 第一次自己写,写的很少。只是一点感想。

    2022年7月27日
  • Baidu与Google地图API初探

    Baidu与Google地图API初探

    2021年12月1日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号