梅花樁詳細分析圓內貪心思路 dfs

2021-10-07 08:58:26 字數 2366 閱讀 2899

問題描述

小明每天都要練功,練功中的重要一項是梅花樁。

小明練功的梅花樁排列成 n 行 m 列,相鄰兩行的距離為 1,相鄰兩列的距離也為 1。

小明站在第 1 行第 1 列上,他要走到第 n 行第 m 列上。小明已經練了一段時間,他現在可以一步移動不超過 d 的距離(直線距離)。

小明想知道,在不掉下梅花樁的情況下,自己最少要多少步可以移動到目標。

輸入格式

輸入的第一行包含兩個整數 n, m,分別表示梅花樁的行數和列數。

第二行包含乙個實數 d(最多包含一位小數),表示小明一步可以移動的距離。

輸出格式

輸出乙個整數,表示小明最少多少步可以到達目標。

樣例輸入

3 4

1.5

樣例輸出

評測用例規模與約定

對於 30% 的評測用例,2 <= n, m <= 20,1 <= d <= 20。

對於 60% 的評測用例,2 <= n, m <= 100,1 <= d <= 100。

對於所有評測用例,2 <= n, m <= 1000,1 <= d <= 100。

思路:

考慮bf

sbfs

bfs,將左上角座標(1,

1)

(1,1)

(1,1

)入隊,令 d[1

][1]

d[1][1]

d[1][1

] 處為0。不斷將隊頭出隊,並將與隊頭座標(i,

j)

(i,j)

(i,j

)距離dis

<

ddisdi

s<

d 的所有座標入隊,並將其座標對應的 d[x

][y]

d[x][y]

d[x][y

] 標記為 d[i

][j]

+1

d[i][j]+1

d[i][j

]+1 ,直到隊列為空,此時,d[n

][m]

d[n][m]

d[n][m

] 處即為答案。

但這並不好實現,在找與隊頭座標(i,

j)

(i,j)

(i,j

)距離dis

<

ddisdi

s<

d 的所有座標的過程中,如果搜尋全圖,必然tle,所以我們要盡可能貪心地找最外圍的情況,因為搜尋的範圍是乙個圓心在左上角的1

4\dfrac

41​圓,所以我們可以採用圓內貪心

先搜尋圓的右邊界:ty=

y+(i

nt)d

ty = y + (int)d

ty=y+(

int)

d(由於不能掉下梅花樁,我們必須取 y+(

int)

dy + (int)d

y+(int

)d為最右的邊界),這肯定能到達,之後採取貪心法找邊界:我們從上到下去找圓的最右邊界(當然是整數點),也就是一直tx ++,但是總會有乙個時刻點會超出圓的右邊界,這時我們需要縮小點的橫座標,即ty --,直到滿足圓內,我們繼續tx ++,這樣一定能找到所有最外圍情況的點

**:

#include

using

namespace std;

const

int n =

1004

int dis[n]

[n];

int n,m;

double d;

queue< pair<

int,

int>

>q;

void

bfs(

)while

(tx <= n && ty >= y && ty <= m)

else ty --;}

} cout<[m]<}int

main()

ps.

**部分借鑑自:藍橋杯校內模擬賽題解

const詳細分析

最近在分析 linux 驅動的過程過程中遇到一些關於 const 的使用,現在在這裡詳細剖析一下 一,const int p 首先分析一下幾個概念 1 p 是乙個指標變數,因而它也是乙個變數,所謂變數就有變數的位址和變數的值,而這裡 p變數的值就是乙個位址,該位址下存放的是乙個整數,p的值等於這個整...

約數詳細分析

約數詳細分析 我們先來認識一下約數 約數分正約數和負約數兩種,我們一般只討論正約數。也就是說,接下來所提的約數,只考慮正約數。如果有乙個數k,滿足k n,那麼k就是n 的約數 因數 n是k的倍數。求乙個數的約數是資訊學競賽裡乙個基礎的不能再基礎的問題。如果只求乙個數,最容易想到的就是列舉。當然列舉也...

vue cli 詳細分析

vue lic 是 vue 官方提供的腳手架工具,預設搭建好乙個專案的基本架子,我們只需要在此基礎上進行相應的修改即可。注意 安裝 vue cli 前需要事先配置好 node 環境 npm install g vue cli 如果是 mac 電 sudo表示以管理員的許可權 sudo install...