《騎士聚會》問題解答

2021-08-22 11:07:25 字數 1316 閱讀 2153

在《程式設計師》第九期演算法擂台中看到這個題目,在這兒給出我的解答方案。

題目要求:求出某一點,使所有的騎士到這一點的時間最短;在保證時間最短的情況的下,所有的騎士到這點的路程之和也最短。

解題思路:

1.先求出每個騎士從開始的位置到任意乙個位置的所需要的最少的天數,儲存在二維陣列days[max_y][max_x]中(其中max_y、max_x分別為棋盤的行數、列數)。

2.對於每個騎士i (0 <= i < n),都有乙個二位陣列daysi[max_y][max_x]。建立兩個陣列maxdays[max_y][max_x]和totaldays[max_y][max_x],使maxdays[y][x] =max(daysi[y][x]),totaldays[y][x] = σdaysi[y][x]。也就是說,二維陣列maxdays的任乙個元素的值為所有的騎士對應的daysi[y][x]的值的最大的乙個,而totaldays的任乙個元素totaldays[y][x]的值為所有騎士的daysi[y][x]的值的和。(其中0<=y < max_y, 0<= x < max_x)。

3.這個時候maxdays中存放的就是所有騎士到每個位置所需要的時間,而totaldays中存放的就是所有騎士到每個位置的總共的步數。遍歷陣列maxdays,找出最小的值(可能有相同的值),這些最小的值就是需要的最少的時間,這些最小的值的位置就是聚會的位置。然後從totaldays中找出所有騎士到聚會位置總共走的步數。位置可能不止乙個,所以要從這些位置中找出總共的步數的最小值(最小值也可能不止乙個)。即過濾掉總共步數不是最小值的位置。

4.最後得到的(x,y)就是我們需要聚會地點,而maxdays[y][x]就是所需要的天數,totaldays[y][x]就是所有騎士總共走的步數。

對於2,3,4步,都比較容易,第1步可以通過廣度遍歷實現:

a) 初始化daysi[max_y][max_x]的所有元素為-1。

b) 假設原始位置為(x0,y0),那麼置days[y0][x0]為0。然後找出從點(x0,y0)所有到達的點(x11,y11)、(x12,y12)…(找到的點可能有0—8個),判斷days[y11][x11]、days[y12][x12]…是否為-1,如果不為-1,則證明在此日期之前就可以達到,所以不用去管。如果為-1,則置days[y11][x11]、days[y12][x12]…為1,依次通過(x11,y11)、(x12,y12)…找出(x21,y21)、(x22,y22)、(x23,y23)……

c) 程式最後結束的條件為所有的點都遍歷過,即找到的所有的下乙個點都不為-1。

至此,問題已解決。時間複雜度我沒有具體地去算,總體來說,程式的執行速度是相當快的。以上是解題的思路,至於程式設計方面的細節問題,我暫時不寫那麼詳細。

。(完)

gridview問題解答

這樣寫 printisopen convert.toboolean datebinder.eval container.dataitem,isopen cs 是這樣的 public string printisopen bool bisopen else return strhhtml 或者說是這樣...

gridview問題解答

這樣寫 printisopen convert.toboolean datebinder.eval container.dataitem,isopen cs 是這樣的 public string printisopen bool bisopen else return strhhtml 或者說是這樣...

jquery 問題解答

1 var v summer input input val 根據class獲取input 2 var v input name user name val 轉義帶.的name 轉義 3 var v input eq 2 val 獲取div內倒數第二個input元素 倒數可以寫負數 4 物件 div...