NC212331. ObstacleCourse障碍训练课
描述
考虑一个 N x N (1 <= N <= 100)的有1个个方格组成的正方形牧场。有些方格是奶牛们不能踏上的,它们被标记为了’x’。例如下图:
. . B x .
. x x A .
. . . x .
. x . . .
. . x . .
贝茜发现自己恰好在点A处,她想去B处的盐块舔盐。缓慢而且笨拙的动物,比如奶牛,十分讨厌转弯。尽管如此,当然在必要的时候她们还是会转弯的。对于一个给定的牧场,请你计算从A到B最少的转弯次数。开始的时候,贝茜可以使面对任意一个方向。贝茜知道她一定可以到达。
输入描述
第 1行: 一个整数 N 行
2..N + 1: 行 i+1 有 N 个字符 (‘.’, ‘x’, ‘A’, ‘B’),表示每个点的状态。
输出描述
行 1: 一个整数,最少的转弯次数。
示例1
输入:
3 .xA … Bx.
输出:
2
C++(clang++ 11.0.1) 解法, 执行用时: 4ms, 内存消耗: 468K, 提交时间: 2022-09-05 15:20:38
#include<iostream> #include<cstring> #include<cstdio> #include<queue> using namespace std; const int N=110; char mp[N][N]; int n,m,sx,sy,ex,ey; bool st[N][N]; int dx[]={1,-1,0,0},dy[]={0,0,1,-1}; struct Node { int x,y; int cnt; }; int bfs() { queue<Node> q; q.push({sx,sy,-1}); while(q.size()) { Node t=q.front(); q.pop(); int x=t.x,y=t.y; for(int i=0;i<4;i++) for(int j=1;;j++) { int xx=x+dx[i]*j,yy=y+dy[i]*j; if(xx<0||xx>n-1||yy<0||yy>n-1||mp[xx][yy]=='x') break; if(st[xx][yy]) continue; if(xx==ex&&yy==ey) return t.cnt+1; if(!st[xx][yy]) { st[xx][yy]=1; q.push({xx,yy,t.cnt+1}); } } } return 0; } int main() { cin>>n; getchar(); for(int i=0;i<n;i++) { scanf("%s",mp[i]); for(int j=0;j<n;j++) { if(mp[i][j]=='A') sx=i,sy=j; if(mp[i][j]=='B') ex=i,ey=j; } } cout<<bfs()<<endl; }