題目描述
小a與小b這次兩個人都被困在了迷宮裡面的兩個不同的位置,而他們希望能夠迅速找到對方,然後再考慮如何逃離迷宮的事情。小a每次可以移動乙個位置,而小b每次可以移動兩次位置,小a移動的方向是上下左右左上左下右上右下8個方向,小b移動的方向是上下左右4個方向,請問他們最早什麼時候能夠找到對方,如果他們最終無法相遇,那麼就輸出」no"。
輸入描述:
第一行兩個整數n,m分別表示迷宮的行和列。\
接下來乙個n\times m 的矩陣\其中"c"表示小a的位置,"d"表示小b的的位置,\
"#「表示不可通過的障礙,」."則是可以正常通過的位置。\字元用空格隔開\第一行兩個整數n,m分別表示迷宮的行和列。
接下來乙個n×m的矩陣
其中"c"表示小a的位置,"d"表示小b的的位置,
"#「表示不可通過的障礙,」."則是可以正常通過的位置。
字元用空格隔開
輸出描述:
如果可以相遇,第一行輸出乙個yes,第二行乙個整數輸出最短的相遇時間。
否則就輸出乙個no表示不能相遇。
示例1
輸入
複製4 5
. . . . .
. # # # .
. . . # d
. . c # .
輸出
yes3
題目很明顯是一道搜尋問題。但是與往常的搜尋問題不同的事。通常我們在使用bfs做搜尋問題的時候,只在起點一端可以移動。但是這裡需要我們同時對ab兩端進行操作。可以當做兩起點的bfs。我們假設對a移動為bfs1,對b移動為bfs2。那麼,每一步,我們需要進行bfs1,bfs2,bfs2操作。對於兩種不同的bfs操作,可以設定vis1,vis2分別進行記錄,一方面是為了該端的搜尋,另一方面當我們對bfs1操作後,如果vis2和vis1同時被記錄那麼我們得到ab兩端相遇,即可直接輸出答案。如果走完n*m次仍然無法相遇,則永遠無法相遇。
#include
#define pii pair
#define line inline
#define reverse(s) reverse(s.begin(), s.end());
using
namespace std;
const
int _max =
1000+50
;int n,m,step;
int dx=
;int dy=
;bool vis[2]
[_max]
[_max]
;char mp[_max]
[_max]
;bool f =
false
;queue q[2]
;void
bfs(
bool k));
if(vis[
!k][x]
[y])}}
}void
solve()
step =0;
while
(step <= n*m)
cout<<
"no"
<}int
main()
數碼 牛客每日一題
題意 給定兩個整數 l 和 r 對於所有滿足 1 l x r 10 9 的 x 把 x 的所有約數全部寫下來。對於每個寫下來的數,只保留最高位的那個數碼。求1 9每個數碼出現的次數。思路 可以轉化為1到 r 的問題,列舉約數 a,找到有多少約數 b,使得 a b 在1 到 r 的範圍內。統計數量。a...
牛客每日一題 保護花
題目連線 這個很明顯是貪心,推導一下公式 假設這一群牛中有a b這兩頭,他們的值分別是ati adi,bti bdi,並且已經知道了總的di值sdi 假設先運a牛就是比先運b牛好,說明先運a牛總的損壞低 則有 sdi adi 2 ati sdi bdi 2 bti 可以發現當 adi 越高 ati越...
牛客網 每日一題 5月9日 過河
時間限制 c c 1秒,其他語言2秒 空間限制 c c 131072k,其他語言262144k 64bit io format lld在河上有一座獨木橋,乙隻青蛙想沿著獨木橋從河的一側跳到另一側。在橋上有一些石子,青蛙很討厭踩在這些石子上。由於橋的長度和青蛙一次跳過的距離都是正整數,我們可以把獨木橋...