1644: [Usaco2007 Oct]Obstacle Course 障碍训练课
Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 707 Solved: 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.
.xA
...
Bx.
Sample Output
2
HINT
Source
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(){ 13 freopen ("lesson.in","r",stdin); 14 freopen ("lesson.out","w",stdout); 15 int i,j,tx,ty,len; 16 scanf("%d ",&n); 17 for (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 } 24 memset(f,127,sizeof(f)),memset(t,false,sizeof(t)); 25 while (!q.empty()) q.pop(); 26 f[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; 27 q.push((Node){xx,yy,0});q.push((Node){xx,yy,1});q.push((Node){xx,yy,2});q.push((Node){xx,yy,3}); 28 while (!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 } 42 printf("%d",min(min(min(f[zz][ww][0],f[zz][ww][1]),f[zz][ww][2]),f[zz][ww][3])); 43 return 0; 44 }