「BZOJ1644」[Usaco2007 Oct] Obstacle Course 障碍训练课
Description
考虑一个 N x N (1 <= N <= 100)的有1个个方格组成的正方形牧场。有些方格是奶牛们不能踏上的,它们被标记为了’x’。例如下图:
. . B x .
. x x A .
. . . x .
. x . . .
. . x . .
贝茜发现自己恰好在点A处,她想去B处的盐块舔盐。缓慢而且笨拙的动物,比如奶牛,十分讨厌转弯。尽管如此,当然在必要的时候她们还是会转弯的。对于一个给定的牧场,请你计算从A到B最少的转弯次数。开始的时候,贝茜可以使面对任意一个方向。贝茜知道她一定可以到达。
Input
第 1行: 一个整数 N 行
2..N + 1: 行 i+1 有 N 个字符 (‘.’, ‘x’, ‘A’, ‘B’),表示每个点的状态。
Output
行 1: 一个整数,最少的转弯次数。
Sample Input
3
.xA
…
Bx.
.xA
…
Bx.
Sample Output
2
题解
直接bfs T T
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 |
#include<iostream> #include<cstdio> #include<cmath> #include<cstring> #include<algorithm> #define ll long long #define inf 1000000000 using namespace std; int n; int xx[4]={1,-1,0,0},yy[4]={0,0,1,-1}; int bx,by,ex,ey; bool mp[105][105]; int dis[4][105][105]; struct data{int x,y,d,step;}q[40005]; void bfs() { int head=0,tail=0; for(int i=0;i<4;i++) { q[tail].x=bx;q[tail].y=by;q[tail].d=i; dis[i][bx][by]=0; tail++; } while(head!=tail) { int x=q[head].x,y=q[head].y,d=q[head].d,step=q[head].step;head++; if(head==40001)head=0; for(int i=0;i<4;i++) if(step+1<dis[i][x][y]) { q[tail].x=x;q[tail].y=y;q[tail].d=i;q[tail].step=step+1; dis[i][x][y]=step+1; tail++;if(tail==40001)tail=0; } int nowx=x+xx[d],nowy=y+yy[d]; if(nowx<1||nowy<1||nowx>n||nowy>n||mp[nowx][nowy])continue; if(step+1<dis[d][nowx][nowy]) { q[tail].x=nowx;q[tail].y=nowy;q[tail].d=d;q[tail].step=step; dis[d][nowx][nowy]=step; tail++;if(tail==40001)tail=0; } } } int main() { memset(dis,127/3,sizeof(dis)); scanf("%d",&n); char ch[105]; for(int i=1;i<=n;i++) { scanf("%s",ch+1); for(int j=1;j<=n;j++) if(ch[j]=='A')bx=i,by=j; else if(ch[j]=='B')ex=i,ey=j; else if(ch[j]=='x')mp[i][j]=1; } bfs(); int ans=inf; for(int i=0;i<4;i++) ans=min(ans,dis[i][ex][ey]); printf("%d",ans); return 0; } |
Subscribe