杭電OJ 1010, 從非遞迴的DFS 到 剪枝

2021-07-11 23:35:13 字數 1383 閱讀 9392

今天敲了一波杭電的1010,面對迷宮一類的題目,我留在印象中的就是用棧來解決。後來查閱了一下網上的解決方法,發現用的是dfs+剪枝演算法,當然,就我的**而言,單單採用棧來敲,是不能ac的。

從某種程度上來說,我的**就是採用棧和一定的資料結構實現了遞迴的dfs所具備的功能。

廢話不多說,先上**

//每個位置的探索方向按順序依次是(左(l),上(t),右(r),下(b))

#include #include #include using namespace std;

class point //定義點的資料結構

};int main()

; stackb;

int row=0;

int column=0;

int time=0;

int sx,sy; //初始點

int ex,ey; //終點

int wall=0; //x的數量

bool flag=false;

std::cin>>row>>column>>time;

while(!(row==0&&column==0&&time==0))

else if(a[i][j].prop=='d')

else if(a[i][j].prop=='x')

wall++;

}} //剪枝,剪短程式執行時間

if(((time-(abs(sx-ex)+abs(sy-ey)))%2!=0)||(time-(abs(sx-ex)+abs(sy-ey))<0)||row*column-wall<=time)

while(1)

a[sx][sy].currentdirection='t'; //設定該位置下乙個待探索的方向

a[sx][sy].stakestate=true; //進棧

b.push(a[sx][sy]);

sy=sy-1; //更新狗的當前位置

}else

a[sx][sy].currentdirection='t'; //如果前面的條件不符合,直接探索當前位置的下乙個方向

}if(a[sx][sy].currentdirection=='t')

a[sx][sy].currentdirection='r';

a[sx][sy].stakestate=true;

b.push(a[sx][sy]);

sx=sx-1;

}else

a[sx][sy].currentdirection='r';

}if(a[sx][sy].currentdirection=='r')

}

剪枝的問題不解決的話,是不能ac的!

剪枝問題在下屬部落格中講的相當清楚:

OJ 1010 奔赴雲南

描述 第二屆全國中醫藥程式設計大賽在雲南中醫學院舉行,全國各中醫藥院校從全國各地奔赴雲南。每個人的車票或機票上都會有如下資訊 輸入多組資料 每組資料有乙個字串s和兩個整數time1,time2,分別表示地名,出發時間,到達時間。保證 到達時間 出發時間 輸出輸出旅途時間。格式見樣例。輸入樣例 1 h...

飯卡 杭電oj

解題思路就是沒有5元的直接輸出 大於5元的要用5元貪心價值最大的 減去5元後的錢要最優即動態規劃中的01揹包 include include include using namespace std int c 1005 1005 int max int a,int b int main m1 m m...

oj1010 魔獸爭霸之最後的反擊

題目要求 相傳人族與獸族對峙了很久,雙方均受到了重創,獸族趁人類沒有能力發起大規模進攻之時突然襲擊,想一次徹底打敗人族。人類為了生存,無論老幼傷病,全部參戰,兵分兩路抗敵。由於體質不同,我們以血量表示乙個人的戰鬥力,現在給你所有人的血量,請你把人類分成戰鬥力最接近的兩部分。注意,戰鬥力要最接近,不然...