USACO 2 4 2改 穿越柵欄 多源bfs

2021-07-14 23:12:45 字數 1685 閱讀 2401

fj搭建了乙個巨大的用柵欄圍成的迷宮。幸運的是,他在迷宮的邊界上留出了兩段柵欄作為迷宮的出口,並且從迷宮中的任意一點都能找到一條走出迷宮的路。給定迷宮的行和列數和這個迷宮,然後計算從迷宮中最「糟糕」的那乙個點走出迷宮所需的最少步數。

【輸入格式】

第一行為正數m和n,表示迷宮的行數和列數,用空格隔開。迷宮用乙個由數字組成的矩陣表示,乙個數字表示迷宮的乙個格仔。每乙個格仔的數字告訴我們這個格仔的東、西、南、北是否有柵欄存在。每個數字是由以下四個整數的某個或某幾個或乙個都沒有加起來的。

1: 在西面有柵欄

2: 在北面有柵欄

4: 在東面有柵欄

8: 在南面有柵欄

迷宮內部的柵欄會被規定兩次。比如說(1,1)南面的柵欄,亦會被標記為(2,1)北面的柵欄。

最後兩行是由出口格仔的行列座標。

【輸出格式】

輸出乙個單獨的整數,表示能保證牛從迷宮中任意一點走出迷宮的最小步數。

【輸入輸出樣例】

pass.in

3 5

11 2 10 2 6

3 8 14 5 5

13 3 10 12 9

3 2

3 5pass.out

9【輸入輸出樣例說明】

樣例輸入的迷宮如圖a,最糟糕的點是左下角的格仔,走出迷宮需要9步,見圖b。

(發不了圖)

//圖a

//+-+-+-+-+-+

//| |

//+-+ +-+ + +

//| | | |

//+ +-+-+ + +

//| | |

//+-+ +-+-+-+

【資料範圍】

1 <= m <= 38

1 <= n <= 100

這道改題沒有原題的輸入麻煩,之前做過類似的牆障礙的題,需要處理東南西北以及各個方向的數字,然後從兩個出口格仔多源bfs找到兩個出口到每個格仔的最短路徑長度,路徑長度最大的就是答案。

#include

#include

#include

#include

using

namespace

std;

//0,1,2,3 東南西北;

int n, m, x, y, mat[102][102][4], t, vis[102][102], d[102][102];

int dx = ;

int dy = ;

struct data

;queue

a;int bfs()

); }

}return ans;

}int main()

memset(vis, 0, sizeof(vis));

memset(d, 1, sizeof(d));

for (int i = 1; i <= 2; i++)

); //多源bfs準備

vis[x][y] = 1;

d[x][y] = 1;

}int ans = bfs(); //多源bfs

if(ans==0) printf("1");

else

printf("%d", ans);

return

0;}

USACO2 4題目簡析

題意 約翰和奶牛在10 10的地圖上,地圖上有一些障礙物,他們行走的方式如下 如果正前方沒有障礙物,那麼往前走,否則順時針旋轉90度。開始約翰和奶牛都朝北。如果某次行動後,約翰和奶牛處於同一位置,那麼就表明約翰抓住了奶牛。問 約翰能否抓住奶牛,如果能,輸出抓住的步數。由於狀態只與約翰的位置 奶牛的位...

USACO 2 4 牛的旅行 最短路

農民john的農場裡有很多牧區。有的路徑連線一些特定的牧區。一片所有連通的牧區稱為乙個牧場。但是就目前而言,你能看到至少有兩個牧區不連通。這樣,農民john就有多個牧區了。john想在農場裡新增一條路徑 注意,恰好一條 對這條路徑有以下限制 乙個牧場的直徑就是牧場中最遠的兩個牧區的距離 本題中所提到...

USACO 修理牛棚

同樣是一道貪心題,我的思路是用乙個陣列存下所有的空擋,對空擋進行排序,然後再在總長度中減去前m 1 大的空檔長度。關鍵還是理解題意。貌似洛谷 oj不支援 int min 之類的。還有要對初始資料排一次序,害我 wa了一次。include include includeusing namespace ...