zoukankan      html  css  js  c++  java
  • [Luogu1126] 机器人搬重物

    Description

    机器人移动学会(RMI)现在正尝试用机器人搬运物品。机器人的形状是一个直径1.6米的球。在试验阶段,机器人被用于在一个储藏室中搬运货物。储藏室是一个M*N的网格,有些格子为不可移动的障碍。机器人的中心总是在格点上,当然,机器人必须在最短的时间内把物品搬运到指定的地方。机器人接受的指令有:向前移动1步(Creep);向前移动2步(Walk);向前移动3步(Run);向左转(Left);向右转(Right)。每个指令所需要的时间为1秒。请你计算一下机器人完成任务所需的最少时间。

    Input

    输入的第一行为两个正整数N,M(N,M<=50),下面N行是储藏室的构造,0表示无障碍,1表示有障碍,数字之间用一个空格隔开。接着一行有四个整数和一个大写字母,分别为起始点和目标点左上角网格的行与列,起始时的面对方向(东E,南S,西W,北N),数与数,数与字母之间均用一个空格隔开。终点的面向方向是任意的。

    Output

    一个整数,表示机器人完成任务所需的最少时间。如果无法到达,输出-1。

    Sample Input

    9 10
    0 0 0 0 0 0 1 0 0 0
    0 0 0 0 0 0 0 0 1 0
    0 0 0 1 0 0 0 0 0 0
    0 0 1 0 0 0 0 0 0 0
    0 0 0 0 0 0 1 0 0 0
    0 0 0 0 0 1 0 0 0 0
    0 0 0 1 1 0 0 0 0 0
    0 0 0 0 0 0 0 0 0 0
    1 0 0 0 0 0 0 0 1 0
    7 2 2 7 S
    

    Sample Output

    12
    

    题解

    简单的(BFS)

    #include<iostream>
    #include<cstdio>
    using namespace std;
    
    const int maxnm=60,maxstep=100001;
    const int FQ[2][4]={{1,2,3,0},{3,0,1,2}};
    const int ZB[4][2]={{-1,0},{0,1},{1,0},{0,-1}};
    int n,m,x1,y1,x2,y2,fq1;
    int mp[maxnm][maxnm],vis[5][maxnm][maxnm];
    struct node
    {
    	int x,y,res,fq;
    }Q[maxstep];
    int lQ,rQ;
    
    void Mark(int i,int j)
    {
    	mp[i][j]=mp[i+1][j]=mp[i][j+1]=mp[i+1][j+1]=1;
    }
    
    void Read()
    {
    	scanf("%d%d",&n,&m);
    	int num;
    	for(int i=1;i<=n;++i)
    		for(int j=1;j<=m;++j)
    		{
    			scanf("%d",&num);
    			if(num) Mark(i,j);
    		}
    	++n,++m;
    	char eswn;
    	scanf("%d%d%d%d %c",&x1,&y1,&x2,&y2,&eswn);
    	++x1,++y1,++x2,++y2;
    	if(eswn=='N') fq1=0;
    	else if(eswn=='E') fq1=1;
    	else if(eswn=='S') fq1=2;
    	else fq1=3;
    }
    
    bool Check(int x,int y)
    {
    	if(x<=1||x>=n||y<=1||y>=m) return 0;//注意此处不得走边界
    	return 1;
    }
    
    void Bfs()
    {
    	rQ=lQ=1,Q[1]=(node){x1,y1,0,fq1},vis[fq1][x1][y1]=1;
    	while(lQ<=rQ)
    	{
    		if(Q[lQ].x==x2&&Q[lQ].y==y2)
    		{
    			printf("%d
    ",Q[lQ].res);
    			return;
    		}
    		int fq;
    		for(int i=0;i<=1;++i)
    		{
    			fq=FQ[i][Q[lQ].fq];
    			if(!vis[fq][Q[lQ].x][Q[lQ].y])
    			{
    				vis[fq][Q[lQ].x][Q[lQ].y]=1,
    				++rQ,
    				Q[rQ]=(node){Q[lQ].x,Q[lQ].y,Q[lQ].res+1,fq};
    			}
    		}
    		int xx,yy;
    		fq=Q[lQ].fq;
    		for(int i=1;i<=3;++i)
    		{
    			xx=Q[lQ].x+ZB[fq][0]*i,
    			yy=Q[lQ].y+ZB[fq][1]*i;
    			if((Check(xx,yy))&&(!mp[xx][yy]))
    			{
    				if(!vis[fq][xx][yy])
    				{
    					vis[fq][xx][yy]=1,
    					++rQ,
    					Q[rQ]=(node){xx,yy,Q[lQ].res+1,fq};
    				}
    			}
    			else break;//优化
    		}
    		++lQ;
    	}
    	puts("-1");
    }
    
    int main()
    {
    	Read();
    	if(mp[x2][y2]) puts("-1");
    	else Bfs();
    	return 0;
    }
    

    本文作者:OItby @ https://www.cnblogs.com/hihocoder/

    未经允许,请勿转载。

  • 相关阅读:
    Sql 三元运算符
    连表更新
    SQL分组排序去重复
    ASP日常出错原因
    Box2D的三种Body类型
    Android获取屏幕尺寸的方法
    AndEngine之ScreenCapture
    AndEngine之IUpdateHandler,IEntityModifier
    JAVA中线程安全的类
    AndEngine引擎之SmoothCamera 平滑摄像机
  • 原文地址:https://www.cnblogs.com/hihocoder/p/11404749.html
Copyright © 2011-2022 走看看