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)
上一篇 2022年1月14日 下午11:00
下一篇 2022年1月14日 下午11:00


相关推荐

  • matlab画折线图,标记指定点「建议收藏」

    matlab画折线图,标记指定点「建议收藏」首先,找到你需要标注的点。比如说你有x、y两个列向量构成一条曲线。现在要找最大值点那么用p=find(y=max(y)),那么坐标(x(p),y(p))就是你要找的点咯。2第二步如何标记。我介绍两总方法来标记这个点,但是总体上可以归结为一种方法。(1)利用text(x(p),y(p),’o’,’color’,’g’));这里o表示标注的形状,也可以用*、^等比较好看的符号哟。’g’表示的是颜色。(…

    2022年5月20日
    55
  • 蒲式耳,磅换算成公斤和吨

    蒲式耳,磅换算成公斤和吨一个小东西,给自己留作备份用的<!DOCTYPEhtml><htmllang="en"><head><metacharset

    2022年8月3日
    6
  • Win10怎么添加开机启动项?Win10添加开机自动运行软件三种方法

    Win10怎么添加开机启动项?Win10添加开机自动运行软件三种方法Win10 管理开机启动项的方法相信大家已经非常熟悉 msconfig 命令各系统都通用 那么很多用户发觉 Win10 和 Win7XP 等系统不同 没有启动文件夹 那么我们怎么添加开机启动项呢 如晨软件或程序没有开机启动设置的话 是的 在 Win10 中添加开机启动项虽然麻烦了些 但是还是可以设置的 下面小编就分享几种方法 方法一 开机启动文件夹 1 我们打开文件夹 C Users 用户 Administ

    2026年3月26日
    2
  • selenium用法详解【从入门到实战】【Python爬虫】【4万字】[通俗易懂]

    selenium用法详解【从入门到实战】【Python爬虫】【4万字】[通俗易懂]文章目录selenium简介selenium安装安装浏览器驱动确定浏览器版本下载驱动定位页面元素打开指定页面id定位name定位class定位tag定位xpath定位css定位link定位partial_link定位浏览器控制修改浏览器窗口大小浏览器前进&后退浏览器刷新浏览器窗口切换常见操作鼠标控制单击左键单击右键双击拖动鼠标悬停键盘控制设置元素等待显式等待隐式等待强制等待定位一组元素切换操作窗口切换表单切换弹窗处理上传&下载文件上传文件下载文件Chrome浏览器Fir

    2022年4月30日
    158
  • DropDownList绑定数据源的方法[通俗易懂]

    DropDownList绑定数据源的方法[通俗易懂]web       DropDownList绑定数据源的几种方式 第一种                this.ddltype.DataTextField= “btName”;//显示的值                this.ddltype.DataValueField=”btId”;//获取dropdownlist中的值                ddltype.

    2022年10月8日
    5
  • pycharm 激活码3月最新在线激活

    pycharm 激活码3月最新在线激活,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月14日
    40

发表回复

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

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