题目传送门
解题思路:
一道bfs,但本题有几个坑点.
1.题目给的图并不是最终可以用的图,要先手动转换成格点图.
2.机器人有一个直径,则说明原题给的图的障碍的四个节点都不能走.
3.接2,图的四周不能走,因为走的话机器人的一部分会出图.
4.机器人只能左转或右转,向后转需要两个时间.
其实解决了坑点,代码还是很好写的.
AC代码:
1 #include<iostream> 2 #include<cstdio> 3 #include<queue> 4 #include<cmath> 5 #include<map> 6 7 using namespace std; 8 9 int n,m,a[54][54],x2,y2,x1,y11,tot; 10 int tox[4][3] = {-1,-2,-3,0,0,0,1,2,3,0,0,0}; 11 int toy[4][3] = {0,0,0,-1,-2,-3,0,0,0,1,2,3}; 12 bool vis[54][54][4],ok[4][4] = {{0,1,0,1},{1,0,1,0},{0,1,0,1},{1,0,1,0}}; 13 //ok用来判断是不是向左或向右转 14 char o; 15 map<char,int> pp; 16 map<int,char> dp; 17 struct kkk{ 18 int xx,yy,time; 19 char way; 20 }e[126001]; 21 queue<kkk> q; 22 23 inline bool bfs(int x,int y) { 24 vis[x][y][pp[o]] = 1; 25 e[++tot].xx = x; 26 e[tot].yy = y; 27 e[tot].way = o; 28 e[tot].time = 0; 29 q.push(e[tot]); 30 while(!q.empty()) { 31 kkk k = q.front(); 32 q.pop(); 33 if(k.xx == x2 && k.yy == y2) { 34 printf("%d",k.time); 35 return false; 36 } 37 for(int i = 0;i <= 3; i++) { 38 if(i == pp[k.way]) { 39 for(int j = 0;j <= 2; j++) { 40 int tx = k.xx + tox[i][j]; 41 int ty = k.yy + toy[i][j]; 42 if(tx < 1 || tx >= n || ty < 1 || ty >= m) break; 43 if(a[tx][ty] == 1) break; 44 if(!vis[tx][ty][i]) { 45 vis[tx][ty][i] = 1; 46 e[++tot].xx = tx; 47 e[tot].yy = ty; 48 e[tot].time = k.time + 1; 49 e[tot].way = k.way; 50 q.push(e[tot]); 51 } 52 } 53 } 54 else { 55 if(ok[pp[k.way]][i] == 1 && !vis[k.xx][k.yy][i]) { 56 vis[k.xx][k.yy][i] = 1; 57 e[++tot].way = dp[i]; 58 e[tot].time = k.time + 1; 59 e[tot].xx = k.xx; 60 e[tot].yy = k.yy; 61 q.push(e[tot]); 62 } 63 } 64 } 65 } 66 return true; 67 } 68 69 inline void chushimap() { 70 pp['N'] = 0; 71 pp['W'] = 1; 72 pp['S'] = 2; 73 pp['E'] = 3; 74 dp[0] = 'N'; 75 dp[1] = 'W'; 76 dp[2] = 'S'; 77 dp[3] = 'E'; 78 } 79 80 int main() { 81 scanf("%d%d",&n,&m); 82 for(int i = 1;i <= n; i++) 83 for(int j = 1;j <= m; j++) { 84 int ooo; 85 scanf("%d",&ooo); 86 if(ooo == 1) { 87 a[i][j] = 1; 88 a[i][j-1] = 1; 89 a[i-1][j] = 1; 90 a[i-1][j-1] = 1; 91 } 92 } 93 scanf("%d%d%d%d",&x1,&y11,&x2,&y2); 94 cin >> o; 95 chushimap(); 96 // for(int i = 1;i <= n+1; i++) {//格点图生成器 97 // for(int j = 1;j <= m+ 1; j++) 98 // cout << a[i][j] << ' '; 99 // cout << endl; 100 // } 101 if(bfs(x1,y11)) 102 printf("-1"); 103 104 return 0; 105 }