問題描述
小明每天都要練功,練功中的重要一項是梅花樁。輸入格式小明練功的梅花樁排列成 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...