1644: [Usaco Oct]Obstacle Course 障碍训练课
Time Limit:5 SecMemory Limit:64 MBSubmit:707Solved:339
[Submit][Status][Discuss]
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.
Sample Output
2HINT
Source
Silver
PoPoQQQ说这题就是裸的spfa……可惜蒟蒻laj硬是没看出来……唉 :-( 当时想的是相邻的点建边,不过并不知道转弯怎么表示出来……(其实当时想的是这题如果写暴力能拿多少分……)PoPoQQQ的code日常看不懂,于是看了zyf2000的,真是巧妙啊,把一个点分成四个点,分别指向不同的方向,然后直接用数组写spfa……我发现我写链式前向星写傻了 _(:зゝ∠)_ 连最原始的邻接矩阵都把搞忘的了 _(:зゝ∠)_ 辣鸡权限题……刷不了自己id的rank……mmp
1 #include "bits/stdc++.h" 2 using namespace std; 3 typedef long long LL; 4 const int MAX=105; 5 int n; 6 int f[MAX][MAX][4],xx,yy,zz,ww; 7 char s[MAX][MAX];bool t[MAX][MAX][4]; 8 int dx[]={0,0,-1,1}; 9 int dy[]={1,-1,0,0};10 struct Node{int x,y,z;};11 queue <Node> q;12 int main(){13freopen ("lesson.in","r",stdin);14freopen ("lesson.out","w",stdout);15int i,j,tx,ty,len;16scanf("%d\n",&n);17for (i=1;i<=n;i++){18 gets(s[i]+1);19 for (j=1;j<=n;j++){20 if (s[i][j]=='A') xx=i,yy=j;21 if (s[i][j]=='B') zz=i,ww=j;22 }23}24memset(f,127,sizeof(f)),memset(t,false,sizeof(t));25while (!q.empty()) q.pop();26f[xx][yy][0]=f[xx][yy][1]=f[xx][yy][2]=f[xx][yy][3]=0;t[xx][yy][0]=t[xx][yy][1]=t[xx][yy][2]=t[xx][yy][3]=true;27q.push((Node){xx,yy,0});q.push((Node){xx,yy,1});q.push((Node){xx,yy,2});q.push((Node){xx,yy,3});28while (!q.empty()){29 Node u=q.front();q.pop();t[u.x][u.y][u.z]=false;30 for (i=0;i<4;i++){31 tx=u.x+dx[i];ty=u.y+dy[i];32 if (tx<1 || tx>n || ty<1 || ty>n || s[tx][ty]=='x') continue;33 if (u.z==i) len=0;34 else len=1;35 if (f[tx][ty][i]>f[u.x][u.y][u.z]+len){36 f[tx][ty][i]=f[u.x][u.y][u.z]+len;37 if (!t[tx][ty][i])38 q.push((Node){tx,ty,i}),t[tx][ty][i]=true;39 }40 }41}42printf("%d",min(min(min(f[zz][ww][0],f[zz][ww][1]),f[zz][ww][2]),f[zz][ww][3]));43return 0;44 }