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