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

Silver

 

题解

这是一个宽搜,只有在转弯的时候才需要将花费+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\n");
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\n");
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

 

你可能感兴趣的:(USACO)