洛谷P1126 機器人搬重物【bfs】
阿新 • • 發佈:2019-02-04
blank spa https names 多少 emp clas uid 起點
題目鏈接:https://www.luogu.org/problemnew/show/P1126
題意:
給定一個n*m的方格,機器人推著直徑是1.6的球在格子的線上運動。
每一秒鐘可以向左轉,向右轉或者直走1步2步或是3步。
現在給定一個起點和開始的朝向,問走到終點至少要多少時間。
思路:
真是一道狗屎坑題。題目給出的是格點,而機器人是在交點上運動的。
盜用一下洛谷@雒仁韜的圖。題目給出的障礙物其實是橙色的四個點中的右下角的這個。
而且由於球的直徑,最外圍邊界並不能走到。如果正確理解了題意的話應該就沒問題了。
由於有方向,所以用三維數組來存某點是否被訪問。
1 #include<stdio.h> 2#include<stdlib.h> 3 #include<map> 4 #include<set> 5 #include<iostream> 6 #include<cstring> 7 #include<algorithm> 8 #include<vector> 9 #include<queue> 10 11 using namespace std; 12 13 int n, m; 14 int mat[55][55]; 15 //0E, 1S, 2W, 3N16 int dx[4][3] = {{0, 0, 0}, {1, 2, 3}, {0, 0, 0}, {-1, -2, -3}}; 17 int dy[4][3] = {{1, 2, 3}, {0, 0, 0}, {-1, -2, -3}, {0, 0, 0}}; 18 bool vis[55][55][5]; 19 struct node{ 20 int x, y; 21 int dir; 22 int t; 23 }st, ed; 24 25 int getdir(char c) 26 { 27 if(c == ‘E‘)return 0; 28 if(c == ‘S‘)return 1; 29 if(c == ‘W‘)return 2; 30 if(c == ‘N‘)return 3; 31 } 32 33 bool check(int i, int j) 34 { 35 return (i >= 1 && i < n && j >= 1 && j < m); 36 } 37 38 int main() 39 { 40 scanf("%d%d", &n, &m); 41 for(int i = 1; i <= n; i++){ 42 for(int j = 1; j <= m; j++){ 43 scanf("%d", &mat[i][j]); 44 if(mat[i][j]){ 45 mat[i - 1][j] = 1; 46 mat[i][j - 1] = 1; 47 mat[i - 1][j - 1] = 1; 48 } 49 } 50 } 51 52 scanf("%d%d%d%d", &st.x, &st.y, &ed.x, &ed.y); 53 char dir; 54 //st.x--;st.y--;ed.x--;ed.y--; 55 getchar(); 56 scanf("%c", &dir); 57 st.dir = getdir(dir); 58 st.t = 0; 59 60 queue<node>que; 61 que.push(st); 62 vis[st.x][st.y][st.dir] = true; 63 int ans = -1; 64 while(!que.empty()){ 65 node now = que.front();que.pop(); 66 //cout<<endl<<now.x<<" "<<now.y<<" "<<now.t<<endl; 67 if(now.x == ed.x && now.y == ed.y){ 68 ans = now.t; 69 break; 70 } 71 node to; 72 to.x = now.x;to.y = now.y;to.t = now.t + 1; 73 to.dir = (now.dir + 1) % 4; 74 if(!vis[to.x][to.y][to.dir]){ 75 vis[to.x][to.y][to.dir] = true; 76 que.push(to); 77 } 78 to.dir = (now.dir - 1 + 4) % 4; 79 if(!vis[to.x][to.y][to.dir]){ 80 vis[to.x][to.y][to.dir] = true; 81 que.push(to); 82 } 83 84 to.dir = now.dir; 85 for(int i = 0; i < 3; i++){ 86 to.x = now.x + dx[to.dir][i]; 87 to.y = now.y + dy[to.dir][i]; 88 if(mat[to.x][to.y])break; 89 if(check(to.x, to.y) && !vis[to.x][to.y][to.dir]){ 90 vis[to.x][to.y][to.dir] = true; 91 que.push(to); 92 //cout<<to.x<<" "<<to.y<<" "<<to.t<<endl; 93 } 94 } 95 } 96 97 cout<<ans<<endl; 98 99 return 0; 100 }
洛谷P1126 機器人搬重物【bfs】