zoukankan      html  css  js  c++  java
  • BZOJ 1644: [Usaco2007 Oct]Obstacle Course 障碍训练课

    题目

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

    Time Limit: 5 Sec  Memory Limit: 64 MB

    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

    题解

    这是一个宽搜,只有在转弯的时候才需要将花费+1。感觉有点烦不想写了QAQ。

    代码

     1 /*Author:WNJXYK*/
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<queue>
     5 using namespace std;
     6 int T;
     7 int n,m,w;
     8 struct Edge{
     9     int v;
    10     int t;
    11     int nxt;
    12     Edge(){}
    13     Edge(int a,int b,int c){
    14         v=a;t=b;nxt=c;
    15     }
    16 };
    17 Edge e[6000];
    18 int nume;
    19 int head[510];
    20 
    21 inline void addSingleEdge(int x,int y,int w){
    22     e[++nume]=Edge(y,w,head[x]);
    23     head[x]=nume;
    24 }
    25 inline void addEdge(int x,int y,int w){
    26     addSingleEdge(x,y,w);
    27     addSingleEdge(y,x,w);
    28 }
    29 
    30 queue<int> que;
    31 int dist[510];
    32 bool inque[510];
    33 int intime[510];
    34 
    35 inline void solve(){
    36     bool isPrint=false;
    37     while(!que.empty()) que.pop();
    38     memset(dist,127/3,sizeof(dist));
    39     memset(inque,false,sizeof(inque));
    40     memset(intime,0,sizeof(intime));
    41     que.push(1);
    42     dist[1]=0;
    43     inque[1]=true;
    44     intime[1]++;
    45     while(!que.empty()){
    46         int now=que.front();
    47         que.pop();
    48         for (int i=head[now];i;i=e[i].nxt){
    49             int v=e[i].v;int w=e[i].t;
    50             if (dist[v]>dist[now]+w){
    51                 intime[v]++;
    52                 if (intime[v]>n){
    53                     printf("YES
    ");
    54                     isPrint=true;
    55                     break;
    56                 }
    57                 dist[v]=dist[now]+w;
    58                 if (!inque[v]){
    59                     inque[v]=true;
    60                     que.push(v);
    61                 }
    62             }
    63         }
    64         if (isPrint) break;
    65         inque[now]=false;
    66     }
    67     if (isPrint==false) printf("NO
    ");
    68 }
    69 inline void read(){
    70     scanf("%d%d%d",&n,&m,&w);
    71     memset(head,0,sizeof(head));
    72     nume=0;
    73     for (int i=1;i<=m;i++){
    74         int x,y,t;
    75         scanf("%d%d%d",&x,&y,&t);
    76         addEdge(x,y,t);
    77     }
    78     for (int i=1;i<=w;i++){
    79         int x,y,t;
    80         scanf("%d%d%d",&x,&y,&t);
    81         addSingleEdge(x,y,-t);
    82     }
    83 }
    84 
    85 int main(){
    86     scanf("%d",&T);
    87     for (;T--;){
    88         read();
    89         solve();
    90     }
    91     return 0;
    92 }
    View Code
  • 相关阅读:
    HDU 1207 汉诺塔II (递推)
    HDU 3172 Virtual Friends (map+并查集)
    HDU 1272 小希的迷宫(并查集)
    hihoCoder #1037 : 数字三角形 (动态规划)
    51Nod 1256 乘法逆元
    AtCoder Regular Contest 077 D
    AtCoder Regular Contest 077 C
    AtCoder Beginner Contest 066 B
    AtCoder Beginner Contest 045 C
    AtCoder Beginner Contest 045 B
  • 原文地址:https://www.cnblogs.com/WNJXYK/p/4072479.html
Copyright © 2011-2022 走看看