• BZOJ-1644: [Usaco2007 Oct]Obstacle Course 障碍训练课(SPFA)


    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);
    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 }
    未来是什么样,未来会发生什么,谁也不知道。 但是我知道, 起码从今天开始努力, 肯定比从明天开始努力, 要快一天实现梦想。 千里之行,始于足下! ——《那年那兔那些事儿》
  • 相关阅读:
    C#-获取页面源代码
    C#-获取页面源代码
    C#-窗体移动
    C#-窗体移动
    C#-窗体鼠标穿透
    C#-窗体鼠标穿透
    C#-string生成图片
    C#-string生成图片
    C#-Stmp发邮件
    POJ-1611 The Suspects
  • 原文地址:https://www.cnblogs.com/keximeiruguo/p/7701982.html
Copyright © 2020-2023  润新知