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 }

时间: 2024-10-04 11:36:18

BZOJ 1644: [Usaco2007 Oct]Obstacle Course 障碍训练课的相关文章

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

BFS... 我连水题都不会写了QAQ ------------------------------------------------------------------------- #include<cstdio> #include<algorithm> #include<cstring> #include<iostream> #include<queue> #define rep( i , n ) for( int i = 0 ; i &

BZOJ 1644 Usaco2007 Oct Obstacle Course 障碍训练课 SPFA

题目大意:给定一个有坏点的网格图,从A点走到B点,要求拐弯最少 裸SPFA--在状态那里记录下方向就好了 水水更健康~~ #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define M 10100 #define P(x,y) ((x)*n-n+(y)) using namespace std; const int dx[]={0,0,1,-1};

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

1644: [Usaco2007 Oct]Obstacle Course 障碍训练课 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 383  Solved: 196[Submit][Status][Discuss] Description 考虑一个 N x N (1 <= N <= 100)的有1个个方格组成的正方形牧场.有些方格是奶牛们不能踏上的,它们被标记为了'x'.例如下图: . . B x .. x x A .. . . x .. x .

BZOJ 1709: [Usaco2007 Oct]Super Paintball超级弹珠

题目 1709: [Usaco2007 Oct]Super Paintball超级弹珠 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 329  Solved: 255[Submit][Status] Description 奶牛们最近从著名的奶牛玩具制造商Tycow那里,买了一套仿真版彩弹游戏设备(类乎于真人版CS). Bessie把她们玩游戏草坪划成了N * N(1 <= N<= 100)单位的矩阵,同时列出了她的 K (1 <= K &l

BZOJ 1708: [Usaco2007 Oct]Money奶牛的硬币( dp )

背包dp.. -------------------------------------------------------------------------------- #include<cstdio> #include<algorithm> #include<cstring> #include<iostream> #define rep( i , n ) for( int i = 0 ; i < n ; ++i ) #define clr( x

bzoj 1709: [Usaco2007 Oct]Super Paintball超级弹珠【枚举】

k是1e5范围的,吗? 注意到n只有100,这意味着k去重之后之后n^2,也就是1e4! 然后就可以愉快的n^4枚举了,枚举每个格子,再枚举每个敌人,如果当前格子射不到敌人则退出,否则满足所有敌人则ans++ #include<iostream> #include<cstdio> #include<algorithm> using namespace std; const int N=105; int n,m,tot,ans; bool v[N][N]; struct

bzoj1709[Usaco2007 Oct]Super Paintball超级弹珠*

bzoj1709[Usaco2007 Oct]Super Paintball超级弹珠 题意: n*n的网格中有k头牛.在一个格子里发射子弹可以射中本格子,同行,同列,左斜线,右斜线(就是一个米字形)的牛,问能射中所有牛的格子有几个.n≤100. 题解: 枚举所有格子,从当前格子出发按题目里的方向走累计被射中的牛即可. 代码: 1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #define

1709: [Usaco2007 Oct]Super Paintball超级弹珠

1709: [Usaco2007 Oct]Super Paintball超级弹珠 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 339  Solved: 264[Submit][Status] Description 奶牛们最近从著名的奶牛玩具制造商Tycow那里,买了一套仿真版彩弹游戏设备(类乎于真人版CS). Bessie把她们玩游戏草坪划成了N * N(1 <= N<= 100)单位的矩阵,同时列出了她的 K (1 <= K <=

BZOJ 3407: [Usaco2009 Oct]Bessie&#39;s Weight Problem 贝茜的体重问题( dp )

01背包... ----------------------------------------------------------------------- #include<cstdio> #include<algorithm> #include<cstring> #include<iostream> #define rep( i , n ) for( int i = 0 ; i < n ; i++ ) #define clr( x , c ) m