zoukankan      html  css  js  c++  java
  • luogu P1126 机器人搬重物 题解

    luogu P1126 机器人搬重物 题解

    题目描述

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

    输入输出格式

    输入格式:

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

    输出格式:

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

    输入输出样例

    输入样例#1:

    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

    输出样例#1:

    12

    思路

    这道题就是bfs啦啦啦。
    注意一下细节。
    这个机器人是要占4个格子的。
    然后加了一个优化:
    用f数组记忆化bfs。
    下附代码:

    #include<bits/stdc++.h>
    using namespace std;
    inline int read(){
    	int ret=0,f=1;char ch=getchar();
    	while (ch<'0'||ch>'9') {if (ch=='-') f=-f;ch=getchar();}
    	while (ch>='0'&&ch<='9') ret=ret*10+ch-'0',ch=getchar();
    	return ret*f;
    }
    int n,m,a[55][55],fx,fy,tx,ty,tu,INF;
    bool vis[55][55][6];
    int dis[55][55][6];
    struct node{
    	int x,y,turn;
    };
    bool check(int x,int y){
    	if(a[x][y]==0&&a[x+1][y]==0&&a[x][y+1]==0&&a[x+1][y+1]==0){
    		return 1;
    	}
    	return 0;
    }
    void print(){
    	for(int k=1;k<=4;k++){
    	for(int i=1;i<=n;i++){
    		for(int j=1;j<=n;j++) cout<<dis[i][j][k]<<" ";
    		puts("");
    	}
    	cout<<k<<endl;
    	system("pause");
    	system("cls");
    	}
    }
    void bfs(){
    	memset(vis,0,sizeof(vis));
    	memset(dis,63,sizeof(dis));INF=dis[0][0][0];
    	dis[fx][fy][tu]=0;
    	vis[fx][fy][tu]=1;
    	queue<node> q;
    	node p;p.x=fx;p.y=fy;p.turn=tu;q.push(p);
    	while(!q.empty()){
    		node u=q.front();q.pop();
    		vis[u.x][u.y][u.turn]=0;
    //		print();
    //		cout<<"bfs  "<<u.x<<"  "<<u.y<<"  "<<u.turn<<"  ";
    //		cout<<dis[u.x][u.y][u.turn]<<endl;
    		if(u.turn==1){
    			if(u.x+1<=n-1&&check(u.x+1,u.y)&&dis[u.x+1][u.y][u.turn]>dis[u.x][u.y][u.turn]+1){
    				dis[u.x+1][u.y][u.turn]=dis[u.x][u.y][u.turn]+1;
    				if(vis[u.x+1][u.y][u.turn]==0){
    					vis[u.x+1][u.y][u.turn]=1;
    					node tmp;
    					tmp.x=u.x+1;tmp.y=u.y;tmp.turn=u.turn;
    					q.push(tmp);
    				}
    			}
    			if(check(u.x+1,u.y)&&u.x+2<=n-1&&check(u.x+2,u.y)&&dis[u.x+2][u.y][u.turn]>dis[u.x][u.y][u.turn]+1){
    				dis[u.x+2][u.y][u.turn]=dis[u.x][u.y][u.turn]+1;
    				if(vis[u.x+2][u.y][u.turn]==0){
    					vis[u.x+2][u.y][u.turn]=1;
    					node tmp;
    					tmp.x=u.x+2;tmp.y=u.y;tmp.turn=u.turn;
    					q.push(tmp);
    				}
    			}
    			if(check(u.x+1,u.y)&&check(u.x+2,u.y)&&u.x+3<=n-1&&check(u.x+3,u.y)&&dis[u.x+3][u.y][u.turn]>dis[u.x][u.y][u.turn]+1){
    				dis[u.x+3][u.y][u.turn]=dis[u.x][u.y][u.turn]+1;
    				if(vis[u.x+3][u.y][u.turn]==0){
    					vis[u.x+3][u.y][u.turn]=1;
    					node tmp;
    					tmp.x=u.x+3;tmp.y=u.y;tmp.turn=u.turn;
    					q.push(tmp);
    				}
    			}
    			
    			if(dis[u.x][u.y][2]>dis[u.x][u.y][u.turn]+1){
    				dis[u.x][u.y][2]=dis[u.x][u.y][u.turn]+1;
    				if(vis[u.x][u.y][2]==0){
    					vis[u.x][u.y][2]=1;
    					node tmp;
    					tmp.x=u.x;tmp.y=u.y;tmp.turn=2;
    					q.push(tmp);
    				}
    			}
    			if(dis[u.x][u.y][4]>dis[u.x][u.y][u.turn]+1){
    				dis[u.x][u.y][4]=dis[u.x][u.y][u.turn]+1;
    				if(vis[u.x][u.y][4]==0){
    					vis[u.x][u.y][4]=1;
    					node tmp;
    					tmp.x=u.x;tmp.y=u.y;tmp.turn=4;
    					q.push(tmp);
    				}
    			}
    		}
    		
    		if(u.turn==2){
    			if(u.y+1<=m-1&&check(u.x,u.y+1)&&dis[u.x][u.y+1][u.turn]>dis[u.x][u.y][u.turn]+1){
    				dis[u.x][u.y+1][u.turn]=dis[u.x][u.y][u.turn]+1;
    				if(vis[u.x][u.y+1][u.turn]==0){
    					vis[u.x][u.y+1][u.turn]=1;
    					node tmp;
    					tmp.x=u.x;tmp.y=u.y+1;tmp.turn=u.turn;
    					q.push(tmp);
    				}
    			}
    			if(check(u.x,u.y+1)&&u.y+2<=m-1&&check(u.x,u.y+2)&&dis[u.x][u.y+2][u.turn]>dis[u.x][u.y][u.turn]+1){
    				dis[u.x][u.y+2][u.turn]=dis[u.x][u.y][u.turn]+1;
    				if(vis[u.x][u.y+2][u.turn]==0){
    					vis[u.x][u.y+2][u.turn]=1;
    					node tmp;
    					tmp.x=u.x;tmp.y=u.y+2;tmp.turn=u.turn;
    					q.push(tmp);
    				}
    			}
    			if(check(u.x,u.y+1)&&check(u.x,u.y+2)&&u.y+3<=m-1&&check(u.x,u.y+3)&&dis[u.x][u.y+3][u.turn]>dis[u.x][u.y][u.turn]+1){
    				dis[u.x][u.y+3][u.turn]=dis[u.x][u.y][u.turn]+1;
    				if(vis[u.x][u.y+3][u.turn]==0){
    					vis[u.x][u.y+3][u.turn]=1;
    					node tmp;
    					tmp.x=u.x;tmp.y=u.y+3;tmp.turn=u.turn;
    					q.push(tmp);
    				}
    			}
    			
    			if(dis[u.x][u.y][3]>dis[u.x][u.y][u.turn]+1){
    				dis[u.x][u.y][3]=dis[u.x][u.y][u.turn]+1;
    				if(vis[u.x][u.y][3]==0){
    					vis[u.x][u.y][3]=1;
    					node tmp;
    					tmp.x=u.x;tmp.y=u.y;tmp.turn=3;
    					q.push(tmp);
    				}
    			}
    			if(dis[u.x][u.y][1]>dis[u.x][u.y][u.turn]+1){
    				dis[u.x][u.y][1]=dis[u.x][u.y][u.turn]+1;
    				if(vis[u.x][u.y][1]==0){
    					vis[u.x][u.y][1]=1;
    					node tmp;
    					tmp.x=u.x;tmp.y=u.y;tmp.turn=1;
    					q.push(tmp);
    				}
    			}
    		}
    		
    		if(u.turn==3){
    			if(u.x-1>=1&&check(u.x-1,u.y)&&dis[u.x-1][u.y][u.turn]>dis[u.x][u.y][u.turn]+1){
    				dis[u.x-1][u.y][u.turn]=dis[u.x][u.y][u.turn]+1;
    				if(vis[u.x-1][u.y][u.turn]==0){
    					vis[u.x-1][u.y][u.turn]=1;
    					node tmp;
    					tmp.x=u.x-1;tmp.y=u.y;tmp.turn=u.turn;
    					q.push(tmp);
    				}
    			}
    			if(check(u.x-1,u.y)&&u.x-2>=1&&check(u.x-2,u.y)&&dis[u.x-2][u.y][u.turn]>dis[u.x][u.y][u.turn]+1){
    				dis[u.x-2][u.y][u.turn]=dis[u.x][u.y][u.turn]+1;
    				if(vis[u.x-2][u.y][u.turn]==0){
    					vis[u.x-2][u.y][u.turn]=1;
    					node tmp;
    					tmp.x=u.x-2;tmp.y=u.y;tmp.turn=u.turn;
    					q.push(tmp);
    				}
    			}
    			if(check(u.x-1,u.y)&&check(u.x-2,u.y)&&u.x-3>=1&&check(u.x-3,u.y)&&dis[u.x-3][u.y][u.turn]>dis[u.x][u.y][u.turn]+1){
    				dis[u.x-3][u.y][u.turn]=dis[u.x][u.y][u.turn]+1;
    				if(vis[u.x-3][u.y][u.turn]==0){
    					vis[u.x-3][u.y][u.turn]=1;
    					node tmp;
    					tmp.x=u.x-3;tmp.y=u.y;tmp.turn=u.turn;
    					q.push(tmp);
    				}
    			}
    			
    			if(dis[u.x][u.y][4]>dis[u.x][u.y][u.turn]+1){
    				dis[u.x][u.y][4]=dis[u.x][u.y][u.turn]+1;
    				if(vis[u.x][u.y][4]==0){
    					vis[u.x][u.y][4]=1;
    					node tmp;
    					tmp.x=u.x;tmp.y=u.y;tmp.turn=4;
    					q.push(tmp);
    				}
    			}
    			if(dis[u.x][u.y][2]>dis[u.x][u.y][u.turn]+1){
    				dis[u.x][u.y][2]=dis[u.x][u.y][u.turn]+1;
    				if(vis[u.x][u.y][2]==0){
    					vis[u.x][u.y][2]=1;
    					node tmp;
    					tmp.x=u.x;tmp.y=u.y;tmp.turn=2;
    					q.push(tmp);
    				}
    			}
    		}
    		
    		if(u.turn==4){
    			if(u.y-1>=1&&check(u.x,u.y-1)&&dis[u.x][u.y-1][u.turn]>dis[u.x][u.y][u.turn]+1){
    				dis[u.x][u.y-1][u.turn]=dis[u.x][u.y][u.turn]+1;
    				if(vis[u.x][u.y-1][u.turn]==0){
    					vis[u.x][u.y-1][u.turn]=1;
    					node tmp;
    					tmp.x=u.x;tmp.y=u.y-1;tmp.turn=u.turn;
    					q.push(tmp);
    				}
    //				puts("WA");
    			}
    			if(check(u.x,u.y-1)&&u.y-2>=1&&check(u.x,u.y-2)&&dis[u.x][u.y-2][u.turn]>dis[u.x][u.y][u.turn]+1){
    				dis[u.x][u.y-2][u.turn]=dis[u.x][u.y][u.turn]+1;
    				if(vis[u.x][u.y-2][u.turn]==0){
    					vis[u.x][u.y-2][u.turn]=1;
    					node tmp;
    					tmp.x=u.x;tmp.y=u.y-2;tmp.turn=u.turn;
    					q.push(tmp);
    				}
    			}
    			if(check(u.x,u.y-1)&&check(u.x,u.y-2)&&u.y-3>=1&&check(u.x,u.y-3)&&dis[u.x][u.y-3][u.turn]>dis[u.x][u.y][u.turn]+1){
    				dis[u.x][u.y-3][u.turn]=dis[u.x][u.y][u.turn]+1;
    				if(vis[u.x][u.y-3][u.turn]==0){
    					vis[u.x][u.y-3][u.turn]=1;
    					node tmp;
    					tmp.x=u.x;tmp.y=u.y-3;tmp.turn=u.turn;
    					q.push(tmp);
    				}
    			}
    			
    			if(dis[u.x][u.y][1]>dis[u.x][u.y][u.turn]+1){
    				dis[u.x][u.y][1]=dis[u.x][u.y][u.turn]+1;
    				if(vis[u.x][u.y][1]==0){
    					vis[u.x][u.y][1]=1;
    					node tmp;
    					tmp.x=u.x;tmp.y=u.y;tmp.turn=1;
    					q.push(tmp);
    				}
    			}
    			if(dis[u.x][u.y][3]>dis[u.x][u.y][u.turn]+1){
    				dis[u.x][u.y][3]=dis[u.x][u.y][u.turn]+1;
    				if(vis[u.x][u.y][3]==0){
    					vis[u.x][u.y][3]=1;
    					node tmp;
    					tmp.x=u.x;tmp.y=u.y;tmp.turn=3;
    					q.push(tmp);
    				}
    			}
    		}
    		
    	}
    }
    int main(){
        freopen("robot.in","r",stdin);
    	freopen("robot.out","w",stdout);
        n=read();m=read();
        for(int i=1;i<=n;i++){
        	for(int j=1;j<=m;j++){
        		a[i][j]=read();
    		}
    	}
    	fx=read();fy=read();tx=read();ty=read();char ch;cin>>ch;
    //	swap(fx,fy);swap(tx,ty);
    	switch(ch){
    		case 'E':tu=2;break;
    		case 'S':tu=1;break;
    		case 'W':tu=4;break;
    		case 'N':tu=3;break;
    	}
    //	cout<<tu<<endl;
    	bfs();
    //	cout<<dis[tx][ty][1]<<endl;
    	
    	int ans=min(min(dis[tx][ty][1],dis[tx][ty][2]),min(dis[tx][ty][3],dis[tx][ty][4]));
    	/*
    	cout<<dis[tx][ty][1]<<endl;
    	cout<<dis[tx][ty][2]<<endl;
    	cout<<dis[tx][ty][3]<<endl;
    	cout<<dis[tx][ty][4]<<endl;
    	*/
    	if(ans>=INF-1) printf("-1
    ");
    	else printf("%d
    ",ans);
        return 0;
    }
    
  • 相关阅读:
    Graphics总结
    自动布局
    引导页总结
    日常记录未分类
    .net core linux部署方案宝典大全
    .net core linux部署方案宝典大全
    .net core linux部署方案宝典大全
    .net core linux部署方案宝典大全
    .net core linux部署方案宝典大全
    .net core linux部署方案宝典大全
  • 原文地址:https://www.cnblogs.com/yzx1798106406/p/9794233.html
Copyright © 2011-2022 走看看