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 < n ; ++i )

#define clr( x , c ) memset( x , c , sizeof( x ) )

#define Rep( i , n ) for( int i = 1 ; i <= n ; ++i )

using namespace std;

const int maxn = 100 + 5;

const int inf = 0x3f3f3f3f;

const int dir[ 4 ][ 2 ] = { { 0 , 1 } , { 0 , -1 } , { 1 , 0 } , { -1 , 0 } };

const int turn[ 4 ][ 4 ] = { { 1 , 0 , 1 , 1 } , { 1 , 1 , 1 , 0 } , { 1 , 1 , 0 , 1 } , { 0 , 1 , 1 , 1 } };

const int face[ 4 ] = { 1 , 3 , 2 , 0 };

int d[ 4 ][ maxn ][ maxn ];

int G[ maxn ][ maxn ];

int goal[ 2 ] , start[ 2 ];

#define goal( x , y ) ( x == goal[ 0 ] && y == goal[ 1 ] )

struct Node {

int x , y , cnt , f;

};

queue< Node > Q;

void BFS() {

rep( i , 4 ) {

d[ i ][ start[ 0 ] ][ start[ 1 ] ] = 0;

Q.push( ( Node ) { start[ 0 ] , start[ 1 ] , 0 , i } );

}

while( ! Q.empty() ) {

Node o = Q.front();

Q.pop();

rep( i , 4 ) {

int x = o.x + dir[ i ][ 0 ] , y = o.y + dir[ i ][ 1 ];

if( ! G[ x ][ y ] ) continue;

int cnt = o.cnt + turn[ i ][ o.f ];

if( d[ face[ i ] ][ x ][ y ] > cnt ) {

d[ face[ i ] ][ x ][ y ] = cnt;

if( ! goal( x , y ) ) Q.push( ( Node ) { x , y , cnt , face[ i ] } );

}

}

}

}

int main() {

// freopen( "test.in" , "r" , stdin );

// freopen( "test.out" , "w" , stdout );

int n;

cin >> n;

clr( G , 0 );

Rep( i , n )

Rep( j , n ) {

char c = getchar();

while( !( c == ‘.‘ || c== ‘x‘ || c == ‘A‘ || c == ‘B‘ ) )

c = getchar();

switch( c ) {

case ‘.‘ : G[ i ][ j ] = 1; break;

case ‘A‘ : G[ start[ 0 ] = i ][ start[ 1 ] = j ] = 1; break;

case ‘B‘ : G[ goal[ 0 ] = i ][ goal[ 1 ] = j ] = 1; break;

default  : break;

}

}

clr( d , inf );

BFS();

int ans = inf;

rep( i , 4 )

ans = min( ans , d[ i ][ goal[ 0 ] ][ goal[ 1 ] ] );

cout << ans << "\n";

return 0;

}

-------------------------------------------------------------------------

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

Time Limit: 5 Sec  Memory Limit: 64 MB
Submit: 390  Solved: 199
[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

时间: 2024-10-13 22:49:38

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

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处的盐块舔盐.缓慢而且笨拙的动物

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

BZOJ 1698 [Usaco2007 Feb]Lilypad Pond 荷叶池塘 BFS+最短路

题意:链接 **方法:**BFS+最短路 解析: 这道题还是挺有意思的. 第一个想法被卡,第一发是二分+bfs,但是这样的话,会有什么处理不了呢?到一个点的流量. 所以就得换想法. 不妨重新定义最短路. 把图中所有的0的点看做可行点,每一次搜出从该点可以到打的0点,然后将这个边权视作1. 即f[i][j]代表到i,j这点的最短路. 显然终点特判: 然后同时记录一下最短路的数量即可. 代码: #include <queue> #include <cstdio> #include &l

bzoj 1627: [Usaco2007 Dec]穿越泥地【bfs】

在洛谷上被卡了一个点开了O2才过= = bfs即可,为方便存储,把所有坐标+500 #include<iostream> #include<cstdio> #include<queue> using namespace std; const int N=1005,dx[]={-1,1,0,0},dy[]={0,0,-1,1}; int n,sx,sy; bool a[N][N],v[N][N]; struct qwe { int x,y,b; qwe(int X=0,i

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