博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BZOJ-1644: [Usaco2007 Oct]Obstacle Course 障碍训练课(SPFA)
阅读量:6842 次
发布时间:2019-06-26

本文共 2402 字,大约阅读时间需要 8 分钟。

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

Time Limit: 5 Sec  Memory Limit: 64 MB
Submit: 707  Solved: 339
[][][]

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

 

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
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 }

 

转载于:https://www.cnblogs.com/keximeiruguo/p/7701982.html

你可能感兴趣的文章