牛客網 bfs 逃脫 切比雪夫距離

2021-09-19 06:58:54 字數 1955 閱讀 7773

時間限制:c/c++ 1秒,其他語言2秒

空間限制:c/c++ 32768k,其他語言65536k

64bit io format: %lld

題目描述

這是mengxiang000和tabris來到幼兒園的第四天,幼兒園老師在值班的時候突然發現幼兒園某處發生火災,而且火勢蔓延極快,老師在第一時間就發出了警報,位於幼兒園某處的mengxiang000和tabris聽到了火災警報聲的同時拔腿就跑,不知道兩人是否能夠逃脫險境?

幼兒園可以看成是乙個n*m的圖,在圖中一共包含以下幾種元素:

「.」:表示這是一塊空地,是可以隨意穿梭的。

「#」:表示這是一塊牆,是不可以走到這上邊來的,但是可以被火燒毀。

「s」:表示mengxiang000和tabris所在位子。

「e」:表示幼兒園的出口。

「*」表示火災發源地(保證輸入只有乙個火災發源地)。

已知每秒有火的地方都會向周圍八個格仔(上下左右、左上、右上、左下、右下)蔓延火勢.mengxiang000和tabris每秒都可以選擇周圍四個格仔(上下左右)進行移動。(假設兩人這一秒行動完之後,火勢才蔓延開)

根據已知條件,判斷兩人能否成功逃脫險境,如果可以,輸出最短逃離時間,否則輸出t_t。

為了防止孩子們嬉戲中受傷,牆體是橡膠製作的,可以燃燒的哦。

輸入描述:

第一行輸入乙個整數t,表示一共的測試資料組數。

第二行輸入兩個整數n,m,表示幼兒園的大小。

接下來n行,每行m個字元,表示此格仔是什麼元素。

t<=200

3<=n<=30

3<=m<=30

保證圖中有乙個起點,乙個出口,乙個火災源處

輸出描述:

每組資料輸出一行,如果兩人能夠成功到達出口,那麼輸出最短逃離時間,否則輸出t_t

示例1輸入

35 5……

…s#.

…e.…

5 5…#

…#s#

…##…e

…5 5…s…

…*#.

…e.…

輸出

2t_t

t_t說明

為了防止孩子們嬉戲中受傷,牆體是橡膠製作的,可以燃燒的哦。

思路:

火是往四周蔓延的,所以只要當前位置座標與火源的座標座標之差的絕對值是大於步數的就可以走(也就是切比雪夫距離),需要注意的是火是在行動之後才到的,所以在到終點的時侯也可以等於步數

ac**

#include#include#include#includeusing namespace std;

struct node ;

char tu[32][32];

int sx, sy, ex, ey, n, m, hx, hy;

int dx = ;

int dy = ;

int vis[32][32];

int bfs() );

vis[sx][sy] = 1;

while(!q.empty())

if(max(abs(x - hx), abs(y - hy)) <= t.step)

continue;

vis[x][y] = 1;

q.push(node );}}

}return -1;

}int main()

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

int ans = bfs();

if(ans != -1)

cout << ans << endl;

else cout << "t_t" << endl;

}}

切比雪夫距離

切比雪夫距離是什麼呢?假設有兩個點,a x,y b m,n 那麼這兩個點的切比雪夫距離就是max x m y n 然而它有什麼卵用嗎?我也不知道 然而它可以轉化為曼哈頓距離,這就非常6了.用了乙個非常神奇的思想.我們把座標系順時針旋轉45 這個點到原點的距離是固定的,然後我們用和角公式,這個點的座標...

切比雪夫距離

若點 a x 1,y 1 b x 2,y 2 則兩點間的曼哈頓距離為 x 1 x 2 y 1 y 2 已知 n 個點求兩兩之間的曼哈頓距離之和,易得 x 的貢獻與 y 的貢獻是分開的 可以用兩次排序去絕對值 字首和解決 複雜度 o n log n 曼哈頓距離是 4 向移動的最少步數,切比雪夫距離則是...

1012 曼哈頓距離 切比雪夫距離

什麼是切比雪夫距離?什麼是曼哈頓距離?傻傻分不清,沒關係,看 曼哈頓距離設平面空間內存在兩點,它們的座標為 x1,y1 x2,y2 則dis x1 x2 y1 y2 即兩點橫縱座標差之和 切比雪夫距離 設平面空間內存在兩點,它們的座標為 x1,y1 x2,y2 則dis max x1 x2 y1 y...