可惜没如果=_=
不知那年的樱花树上,哪一瓣最美

1644: [Usaco2007 Oct]Obstacle Course 障碍训练课

Time Limit: 5 Sec  Memory Limit: 64 MB
Submit: 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.

Sample Output

2

HINT

 

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(){
13     freopen ("lesson.in","r",stdin);
14     freopen ("lesson.out","w",stdout);
15     int i,j,tx,ty,len;
16     scanf("%d\n",&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 }

 

posted on 2017-10-20 22:16  珍珠鸟  阅读(135)  评论(0编辑  收藏  举报