HDU 1010 Tempter of the Bone heuristic 修剪
的問題是,在測試修剪。
應該說是更先進的應用。
由于使用的heuristic(經(jīng)驗)修剪。總結這方面的經(jīng)驗法則,別easy。我說,這也是由于先進的在線報告中的應用程序沒有分析太多太好的解決這個問題,計劃給也很慢,只有失去了。從這個很多人不這樣做的問題。
這里我須要更正一下網(wǎng)上流行的說法:奇偶剪枝法。
事實上本題使用奇偶剪枝法并不能太大提快速度,只能說只讓使用奇偶剪枝過掉。
所以網(wǎng)上說本題使用奇偶剪枝的,事實上并不能提快速度。
原因:
奇偶剪枝僅僅能剪枝一次,不能在遞歸的時候剪枝,由于僅僅要初始化位置符合奇偶性,那么之后的隨意方格都會符合奇偶性。
故此理論上也是不能提快速度的。當然本人也實驗過多次。證實奇偶剪枝至少對本題來說用處不大。
本題的主要剪枝法應該是一條: 最大空格數(shù)和步數(shù)比較。就是說假設生下的空格數(shù)位grids。而須要走T步,grids < T的時候,就能夠判定為NO了。
當然還有第二條剪枝:假設當前位置到目標位置最少須要steps步。而須要走T步,那么steps > T,就能夠判定為NO了。
只是事實證明僅僅須要使用第一個剪枝法就能夠了。
第二條剪枝用處也不大,原因:遞歸的格子非常少。計算距離差并不能提高多少速度。
如我以下遞歸循環(huán)中僅僅使用一條主要剪枝就足夠了,不超100ms。盡管沒有做到0ms,只是速度已經(jīng)是夠快的了。
0ms預計須要進一步的剪枝。有大牛,請不吝賜教一下。有空要深入研究一下A*算法才行了。
int sr = 0, sc = 0, dr = 0, dc = 0, n, m, grids, Tsec; vector<string> maze;bool escapeMaze() {if (sr == dr && sc == dc){if (Tsec == 0) return true;return false;}if (grids < Tsec) return false;if (Tsec == 0) return false;maze[sr][sc] = '$';grids--; Tsec--;if (sr+1 <(int)maze.size() && maze[sr+1][sc] == '.'){sr++;if (escapeMaze()) return true;sr--;}if (sc+1 < (int)maze[0].size() && maze[sr][sc+1] == '.'){sc++;if (escapeMaze()) return true;sc--;}if (sc > 0 && maze[sr][sc-1] == '.'){sc--;if (escapeMaze()) return true;sc++;}if (sr > 0 && maze[sr-1][sc] == '.'){sr--;if (escapeMaze()) return true;sr++;}maze[sr][sc] = '.';grids++; Tsec++;return false; }int main() {while (scanf("%d %d %d", &n, &m, &Tsec) && n){grids = n * m - 1;maze.clear(); maze.resize(n);for (int i = 0; i < n; i++){cin>>maze[i];for (int j = 0; j < m; j++){if (maze[i][j] == 'S') sr = i, sc = j; //別忘記了這里是'S'else if (maze[i][j] == 'D') dr = i, dc = j, maze[i][j] = '.';else if (maze[i][j] == 'X') grids--;}}int t = Tsec - (abs(dr - sr) + abs(dc-sc));if (t < 0 || (t & 1) || grids < Tsec) puts("NO");else if (escapeMaze()) puts("YES");else puts("NO");}return 0; }版權聲明:筆者靖心臟,景空間地址:http://blog.csdn.net/kenden23/,只有經(jīng)過作者同意轉載。
總結
以上是生活随笔為你收集整理的HDU 1010 Tempter of the Bone heuristic 修剪的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Machine Learning on
- 下一篇: Canvas实现文字粒子化,并且绕轴旋转