SPFA JZOJ 5781 秘密通道

2022-04-30 20:18:14 字數 2173 閱讀 8743

description

有一副n*m的地圖,有n*m塊地,每塊是下列四種中的一種:

牆:用#表示,牆有4個面,分別是前面,後面,左面,右面。

起點:用c表示,為主角的起點,是一片空地。

終點:用f表示,為主角的目的地,是一片空地。

空地:用 . 表示。

其中除了牆不能穿過,其他地方都能走。

主角有以下3種操作:

1.移動到相鄰的前後左右的地方,花費乙個單位時間。

2.向前後左右其中乙個方向發射子彈,子彈沿直線穿過,打在最近的一堵牆的一面,然後牆的這面就會形成乙個開口通往秘密通道。同一時間最多只能有兩個開口,若出現有3個開口,出現時間最早的開口會立即消失。該操作不用時間。

3.可以從乙個與開口相鄰的空地跳進去,進入秘密通道,從另外乙個開口正對的空地跳出來。這個過程花費乙個單位時間。

地圖四周都是牆,問主角最少用多少時間從c走到f。c和f

只會出現一次。

input

第一行輸入兩個正整數n,m。

接下來n行,每行m個字元描述地圖。

output

輸出1個整數,表示最短時間完成路途。如果無解輸出nemoguce

sample input

input 1

4 4####

#.f#

#c.#

####

input 2

6 8########

#.##..f#

#c.##..#

#..#...#

#.....##

########

input 3

4 5#####

#c#.#

###f#

#####

sample output

output 1

2output 2

4output 3

nemoguce

data constraint

對於50%的資料,4≤ n,m≤ 15。

對於100%的資料,4≤ n,m≤ 500。

hint

分析顯然我們可以貪心:在乙個點,我們到達其他牆面前的距離=min(dis直接走,dis到最近牆的距離+傳送花費時間)

然後就是建一波邊,跑spfa

(其實這題是最難的= =)

#include #include 

#include

#include

using

namespace

std;

const

int n=501

;struct

edge g[

8*n*n];

int cnt,list[n*n];

struct

point st,ed;

char

c[n][n];

int f[n][n],dis[n*n];

bool b[n][n],vis[n*n];

intn,m;

int dx[4]=,dy[4]=;

point p (

int x,int

y) bool

check(point p)

void add(int u,int v,int

w) void

init()

while (c[i][j]!='

#'&&c[i][j]!='

.'&&c[i][j]!='

c'&&c[i][j]!='f'

);

if (c[i][j]=='

c') st.x=i,st.y=j;

if (c[i][j]=='

f') ed.x=i,ed.y=j;

}}void

pre_process()

p.x-=dx[k];p.y-=dy[k];

add(i*m+j,p.x*m+p.y,f[i][j]);

if (check(p(i+dx[k],j+dy[k]))) add(i*m+j,(i+dx[k])*m+j+dy[k],1

); }

}void

spfa()

vis[u]=0

; }

}int

main()

view code

jzoj 5781 秘密通道

開始一看,這不是走迷宮嗎,那就是bfs呀,當然是快樂gg了 誰能想到這是一道圖論題呢 反正不是本蒟蒻 我們把每個空位和上下左右連一條長為1的邊 和上下左右的第一堵牆連一條長為與最近的牆的距離的邊 然後從起點開始,跑一遍spfa就行了 細節問題不一定相同 像找最近的牆時 可以bfs 也可以和我一樣找菱...

Google的秘密通道

微軟風格的入口 mac風格的入口 linux風格的入口 freebsd風格的入口 google有各種語言的版本,下面這些語言可能實在是稀罕了點兒 克林岡語入口 沒看過星際旅行嗎?政治入口 宗教入口 小豬入口 黑客專用入口 google裡還有乙個小小的彩蛋遊戲,大家自己去看吧!下面是一此更有用的彩蛋 ...

大獎賽 秘密資訊

30爆搜,60 01揹包,100折半搜尋。01揹包 dp j 表示在j錢下最多有多少種方案。dp j dp j a i 01揹包要倒推,否則會導致狀態的混亂。include include define ll long long using namespace std ll a 50 ll dp 1...