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 ",now.x,now.y); 56 57 if(now.x==arrivex&&now.y==arrivey) 58 { printf("%d ",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 ",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(){;}