二分 記搜 JZOJ 3522 迷宮花園

2022-04-30 20:03:12 字數 1964 閱讀 3920

description

給定乙個一定存在從起點到終點的路徑的四聯通迷宮。已知tar左右方向移動的時間為1,上下移動的時間為未知實數v。求當tar從起點到終點的最短移動時間為已知實數l時,未知實數v是多少。

input

輸入資料報含多個測試點。第一行為乙個整數t,表示測試點的數目。

對於每乙個測試點,第一行包含實數l和兩個整數r,c。r為迷宮的上下長度,c為迷宮的左右長度。

之後的r行,每行包含c個字元。其中空格表示空地,s表示起點,e表示終點,#表示圍牆。

output

對於每乙個測試點,在單獨的一行內輸出未知實數v,輸出保留5位小數。

sample input

2                                 

2.5 4 5                           

#####

#s  #

#  e#

#####

21 13 12

############

#s##     #e#

# ##  #  # #

#   # #  # #

### # #  # #

#   # #  # #

#  ## #  # #

##  # #  # #

### # #  # #

##  # #  # #

#  ## #    #

#     #    #

############

sample output

0.50000

0.21053

data constraint

20%的資料,1≤ r,c ≤ 10。

100%的資料,1≤ r,c ≤ 100,0≤ v <10。

分析二分+記憶化搜尋,注意bfs中已在佇列中的不要反覆加入,會t

#include #include 

#include

#include

using

namespace

std;

const

int n=110

;struct

point s,e;

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

double

f[n][n];

char

ch[n][n];

intt,r,c;

double

l,v;

bool

inqueue[n][n];

double

cost(point a,point b)

bool

judge(point a,point b)

void

bfs() )) ;

f[to.x][to.y]=f[p.x][p.y]+cost(p,to);

if (!inqueue[to.x][to.y]) q.push(to);

inqueue[to.x][to.y]=1

; }

inqueue[p.x][p.y]=0

; }

}int

main()

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

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

e'&&ch[i][j]!='

s'&&ch[i][j]!='');

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

e') e.x=i,e.y=j;

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

s') s.x=i,s.y=j;

}double ll=1e-7,rr=10.0

;

while (rr-ll>=1e-7

) printf(

"%.5lf\n

",v);}}

view code

jzoj3522 迷宮花園 二分 spfa

description 給定乙個一定存在從起點到終點的路徑的四聯通迷宮。已知tar左右方向移動的時間為1,上下移動的時間為未知實數v。求當tar從起點到終點的最短移動時間為已知實數l時,未知實數v是多少。input 輸入資料報含多個測試點。第一行為乙個整數t,表示測試點的數目。對於每乙個測試點,第一...

JZOJ 二分 抄書

與書的複製差不多 洛谷 書的複製 但是只要輸出最大的時間 樣例輸入9 3 100 200 300 400 500 600 700 800 900樣例輸出1700樣例解釋1 1500 100 200 300 400 500 2 1300 600 700 3 1700 800 900 1300 1500...

二分搜素演算法

二分搜尋演算法的三種情況 推薦部落格,真的寫的非常好!1 當陣列中沒有重複元素時 public int binarysearchimplement int array,int target else if array mid target else if flag return index else...