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 ...