POJ 2632 Crashing Robots 水模拟

题意:给出一个N*M的矩阵;

给出A个机器人,B个动作,机器人位于(x,y)并且有一个朝向。

问做完动作时的状况(机器人i撞上墙 或者机器人i撞上机器人j 或者OK)

思路:纯模拟,用一个结构体保存机器人的状态。

注意:看题目的图,会发现这里的矩阵标号和平时做的不一样,下面会有特殊处理。


看这个图,纵向是从大到小的,得处理一下。这应该就是本题最难的地方吧。。。

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <string>
#include <cmath>
#include <cstring>
#include <queue>
#include <set>
#include <vector>
#include <stack>
#include <map>
#include <iomanip>
#define PI acos(-1.0)
#define Max 205
#define inf 1<<28
using namespace std;

struct kdq
{
    int x,y;
    int dir;
} point[Max];
int n,m;
int movex[4]= {1,0,-1,0}; //下,左,上,右
int movey[4]= {0,-1,0,1};
int inmap(int x,int y)
{
    if(x>0&&y>0&&x<=n&&y<=m)
        return 1;
    return 0;
}
int visit[Max][Max];
int main()
{
    //freopen("acm.txt","r",stdin);
    //freopen("ans.txt","w",stdout);
    int i,j,k,l,T,x,y,tx,ty;
    char a,op;
    int num,move;
    int robotnum,actionnum;
    cin>>T;
    while(T--)
    {
        memset(visit,0,sizeof(visit));
        cin>>m>>n;
        cin>>robotnum>>actionnum;
        for(i=1; i<=robotnum; i++)
        {
            cin>>x>>y>>a;
            point[i].x=n+1-y;//看图会发现他纵向是从大到小的,所以这里得这样处理。
            point[i].y=x;
            if(a=='S')
                point[i].dir=0;
            if(a=='N')
                point[i].dir=2;
            if(a=='E')
                point[i].dir=3;
            if(a=='W')
                point[i].dir=1;
            visit[n+1-y][x]=i;//记录这一点机器人的编号
        }
        bool flag=0;
        while(actionnum--)
        {
            cin>>num>>op>>move;
            if(flag)
            continue;
            if(op=='L')
            {
                int num1=move%4;
                point[num].dir+=(4-num1);
                point[num].dir%=4;
                //cout<<point[num].dir<<endl;
            }
            if(op=='R')
            {
                int num1=move%4;
                point[num].dir+=num1;
                point[num].dir%=4;
                //cout<<point[num].dir<<endl;
            }
            if(op=='F')
            {
                x=point[num].x;
                y=point[num].y;
                int dir=point[num].dir;
                //cout<<dir<<endl;
                while(move--)
                {
                    tx=x+movex[dir];
                    ty=y+movey[dir];
                    //cout<<tx<<" "<<ty<<endl;
                    //cout<<"visit:"<<visit[tx][ty]<<endl;
                    if(inmap(tx,ty))//如果没撞墙
                    {
                        if(!visit[tx][ty])//如果没撞到机器人,则走到这一个位置。
                        {
                            visit[tx][ty]=num;
                            visit[x][y]=0;
                        }
                        else//否则输出撞到机器人
                        {
                            printf("Robot %d crashes into robot %d\n",num,visit[tx][ty]);
                            flag=1;//标记
                        }
                    }
                    else//否则输出撞到墙
                    {
                        flag=1;//标记
                        printf("Robot %d crashes into the wall\n",num);
                    }
                    if(flag)//已标记则跳出
                        break;
                    x=tx,y=ty;
                }
                point[num].x=tx;//注意,这一个动作走完之后要更新这个机器人的坐标
                point[num].y=ty;
            }
        }
        if(!flag)//如果未标记,则输出OK
            cout<<"OK"<<endl;
    }
    return 0;
}

思路是异常的简单,主要是细心一点写代码。

不过写的还是有点乱,没有仔细优化。

Python网络爬虫与推荐算法新闻推荐平台:网络爬虫:通过Python实现新浪新闻的爬取,可爬取新闻页面上的标题、文本、图片、视频链接(保留排版) 推荐算法:权重衰减+标签推荐+区域推荐+热点推荐.zip项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值