Poj 3328的一種解法

2021-06-03 00:22:03 字數 1358 閱讀 2685

題目描述:

今天上午想把3328題做了,一看發現有點難。於是,便上網搜解題報告,最終還是沒找到乙個解題報告。決定自己把它搞定了。看了discussion,有人說要用優先佇列和dij演算法或者dfs再或者bfs,但是我沒用過優先佇列,上午的時間就拿來簡單的學學優先佇列,再複習一下dij演算法。

下午又把題目讀了一遍,發現和我上次做了的那個走迷宮的題極為相似,於是想用和上次一樣的方法(bfs)來解決這個問題,不過這次的這個有點特別:有兩個出發點要同時考慮,乙個左腳,乙個右腳;經過仔細思考,發現bfs是可以解決這個題,於是按著自己的想法寫了個程式,在貢獻了兩次wa後換來了一次ac。

下面就來講講我的解題思路:

根據題意:我們需要注意一下幾點(1)逃跑的這個人是從s標記的方格開始走的,進入每個s方格的可以是這個人的左腳,也可以是這個人的右腳(2)只要任何一支腳到達了t標記的方格,就完成一次逃跑,也就是說可以取得乙個最小時間了(最優解)(3)用其中的乙隻腳進入乙個方格後,另一支腳可以到達的方格是有限制(這個限制題目說的很清除了)。

下面就來看看源程式(程式各個變數的作用都做了詳細的解釋)

////用bfs

#include

#include

#include

#define inf 1000000

using namespace std;

int w,h; //寬度和高度

int grid[65][65];//記錄每個座標點的情況,注意一下:例如grid[2][5],2對應的是豎直向下方向的座標值

//5對應的是水平向右方向的座標值

int d[65][65][2];//記錄到的該座標所需要的最少時間,最低維0下表對應左腳,1下表對應右腳,例如d[3][5][0]的值就是用左腳進入(3,5)點所用的最少時間,d[3][5][1]的值就是用右腳進入(3,5)點所用的最少時間

int min; //用於儲存我需要的那個最少時間

void init(int ww,int hh) //這個函式主要完成資料的讀入和陣列初始化工作

return ; }

bool inrectangle(int i,int j) //判斷座標(i,j)是否在寬度和高度的允許範圍內

struct pos //定義乙個結構體來儲存某一節點的情況;

void bfs()

}while(!que.empty())

else //下面是兩個結構幾乎一樣的if語句 乙個左腳,乙個右腳

{ //進入p點時用的是左腳

if(d[p.x][p.y][0]>ww>>hh)

{if(ww==0&&hh==0)break;

init(ww,hh);

bfs();

if(min!=inf)

cout<

約瑟夫環的一種簡單解法

首先還是描述一下約瑟夫環問題吧 n個人圍成乙個圈,從第乙個人開始數數 從1開始數 每數到3 當然這個數字可以隨便定 數到3的那個人就退出,接著,他的下乙個人又從1開始數.迴圈不斷,剩下的k個人就是勝利者 當人,這個人數也可以隨便定 接下來的 是利用乙個陣列模擬環,對該陣列進行相應的操作,如果數到3,...

凸包問題一種解法

凸包問題 凸包問題,即在一頂點的集合中找到一些點,使這些點構成的凸多邊形能將所有其它頂點包含在內 解決思想 顯然這些點中最左下 左上 右下 右上方的點一定包含在解集合裡 一些頂點構成的凸多邊形包含其它所有頂點等價於其它頂點都在它的邊所在直線的一邊,在構造解時由於已知一些頂點 如g 可遍歷其它頂點a構...

calc the sum的一種利用棧的解法

這道題解法很多,是遞迴演算法的一道很典型的例題,並且用字串來解效率也還可以 我也不知道時間複雜度多少算效率高,還沒學資料結構 用棧來解效率不高記憶體還大,僅僅為了滿足本人的好奇心而已 不過我們可以先來複習一下什麼是棧 以下是我對棧的理解 棧 stack 是一種線性的表,只能在表末尾進行運算,比如pu...