洛谷—— P1126 机器人搬重物

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了洛谷—— P1126 机器人搬重物相关的知识,希望对你有一定的参考价值。

https://www.luogu.org/problem/show?pid=1126

题目描述

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

输入输出格式

输入格式:

 

输入的第一行为两个正整数N,M(N,M<=50),下面N行是储藏室的构造,0表示无障碍,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

搜索入门中,ε=(´ο`*))),麻烦又恶心,广搜每次每种走法、
注意的几点:黑格子的左侧,左上,上方的格子都不能去,(意会一下),
如果某个点相当前方向不能走i步,则一定不能走i+1步,已经被阻断。
方向改变多模拟几次、
 1 #include <cstdio>
 2 #include <queue>
 3 
 4 bool vis[66][66][4];
 5 int n,m,map[66][66];
 6 int arrivex,arrivey;
 7 int fx[4]={-1,0,1,0};
 8 int fy[4]={0,-1,0,1};
 9 struct Node_pos {
10     int x,y,step;
11     int direction;
12 }now;
13 std::queue<Node_pos>que;
14 
15 inline bool can_go(Node_pos now)
16 {
17     if(now.x>=n||now.y>=m||now.x<1||now.y<1) return false;
18     if(vis[now.x][now.y][now.direction]||vis[now.x+1][now.y+1][now.direction]) return 0;
19     if(vis[now.x+1][now.y][now.direction]||vis[now.x][now.y+1][now.direction]) return 0;
20     if(map[now.x][now.y]||map[now.x+1][now.y]||map[now.x][now.y+1]||map[now.x+1][now.y+1]) return 0;
21     return true;
22 }
23 
24 inline void read(int &x)
25 {
26     x=0; register char ch=getchar();
27     for(;ch>9||ch<0;) ch=getchar();
28     for(;ch>=0&&ch<=9;ch=getchar()) x=x*10+ch-0;
29 }
30 
31 int AC()
32 {
33     read(n),read(m);
34     for(int x,i=1; i<=n; ++i)
35       for(int j=1; j<=m; ++j)
36       {
37           read(map[i][j]);
38           if(map[i][j]) map[i][j-1]=map[i-1][j]=map[i-1][j-1]=1;
39       }
40     read(now.x);read(now.y);
41     read(arrivex);read(arrivey);
42     char s[0];scanf("%s",s);
43     switch (s[0]) {
44         case N: now.direction=0;break;
45         case W: now.direction=1;break;
46         case S: now.direction=2;break;
47         case E: now.direction=3;break;
48     }
49     que.push(now);
50     vis[now.x][now.y][now.direction]=1;
51     for(Node_pos to;!que.empty();)
52     {
53         to=now=que.front(); que.pop();
54         
55 //        printf("%d %d\n",now.x,now.y);
56         
57         if(now.x==arrivex&&now.y==arrivey)
58         { printf("%d\n",now.step); return 0; }
59         for(int i=0; i<3; ++i)
60         {
61             to.x+=fx[now.direction];
62             to.y+=fy[now.direction];
63             if(map[to.x][to.y]||to.x<1||to.y<1||to.x>=n||to.y>=m) break;
64 //            if(!can_go(to)) break;  
65             to.step=now.step+1;
66 //            vis[to.x+1][to.y][now.direction]=1;
67 //            vis[to.x][to.y+1][now.direction]=1;
68 //            vis[to.x+1][to.y+1][now.direction]=1;
69             
70             if(to.x==arrivex&&to.y==arrivey)
71             { printf("%d\n",to.step); return 0; }
72             else if(!vis[to.x][to.y][now.direction])
73             {
74                 vis[to.x][to.y][now.direction]=1;
75                 que.push(to);
76             }
77         }    to=now;
78         if(!vis[now.x][now.y][now.direction+1&3])
79         {
80             to.direction=now.direction+1&3;
81             vis[to.x][to.y][to.direction]=1;
82             to.step=now.step+1; que.push(to);
83         }
84         if(!vis[now.x][now.y][now.direction+3&3])
85         {
86             to.direction=now.direction+3&3;
87             vis[to.x][to.y][to.direction]=1;
88             to.step=now.step+1; que.push(to);
89         }
90     }    puts("-1");
91     return 0;
92 }
93 
94 int Hope=AC();
95 int main(){;} 

 


以上是关于洛谷—— P1126 机器人搬重物的主要内容,如果未能解决你的问题,请参考以下文章

题解洛谷P1126 机器人搬重物

洛谷—— P1126 机器人搬重物

洛谷 P1126 机器人搬重物 (BFS)

广度优先搜索P1126 机器人搬重物 题解

P1126 机器人搬重物

[luogu p1126] 机器人搬重物