苦思無果之餘,某群友發了個帖子給我,我一看,同樣是求2點間所有路徑的演算法,用的是c++和結點棧。
想法非常獨特,引用了乙個線的定義。完美解決了遞迴改為迴圈中的路徑標記問題。
於是本人辛辛苦苦弄了半天終於把遞迴改為了while迴圈+結點棧。
測試後雷了……
花的時間竟然比原來的遞迴還多一點!我這是何苦來哉、、、
其實作者文章開頭就已經宣告了,效率不高。
但沒想到比遞迴還要低,那還不如用遞迴呢?
該帖位址俺就不貼了。
下面是改過後的**。估計是路徑標記的判斷和更新花費太多時間。看來需要從其他方面下手了。
private linkedlistpaths;//當前鍵值集合private linkedlist pathlist;//所有路徑列表
public int pathlistindex=-1;//路徑列表index
public int totalpathnum = 0;//總路徑數
public int maxface = 0;//當前統計出的最大面數
public int maxfaceid = 0;//
stopwatch timer;
public int times;
bool[,] pointispath;
bool[,,,] lineispath;
public void research ()
//第一次迴圈,判斷周圍是否有終點,是否閉合
int i = 0;
int x=0;
for (x = 0; x < j; x++)//遍歷四周可走格仔-pach和空位
else if (temfacenum == maxface)//如果等於當前最大面數
goto exitwhile;
}else if (paths.contains(dir[x]) && ++i > 1)//有2格是路徑,說明閉合了。放棄
}//二次迴圈,遍歷四周可走格仔,只要右路就進,同時設定標識
for (x = 0; x < j; x++)//遍歷四周可走格仔-pach和空位
}if (x < j) continue;//如有路徑,直接迴圈
else
}exitwhile://找到路徑 || 此路不通 || 迴圈無路
paths.removelast();//出棧;
pointispath[pointin.x, pointin.y] = false;//取消標記
//更新line標記
}//while
times[0] = (int)timer.elapsed.totalmilliseconds - times[0];
debug.writeline("-----------------------------");
debug.writeline(times[0]);
}
遞迴與非遞迴演算法
一 題目分析 將非負十進位制整n轉換成b進製 其中b 2 16 將任意正整數n用2的冪次方表示 二 演算法設計 1 轉換進製問題 exer.cpp 遞迴演算法 遞迴出口 n b b 遞迴表示式 f n,b f n b,b n b b 遞迴棧表示 2 用二的冪次方表示任意正整數n問題 exer2.cp...
遞迴演算法向非遞迴演算法轉換
遞迴演算法向非遞迴演算法轉換 遞迴演算法實際上是一種分而治之的方法,它把複雜問題分解為簡單問題來求解。對於某些複雜問題 例如hanio塔問題 遞迴演算法是一種自然且合乎邏輯的解決問題的方式,但是遞迴演算法的執行效率通常比較差。因此,在求解某些問題時,常採用遞迴演算法來分析問題,用非遞迴演算法來求解問...
遞迴演算法向非遞迴演算法轉換
遞迴演算法向非遞迴演算法轉換 遞迴演算法實際上是一種分而治之的方法,它把複雜問題分解為簡單問題來求解。對於某些複雜問題 例如hanio塔問題 遞迴演算法是一種自然且合乎邏輯的解決問題的方式,但是遞迴演算法的執行效率通常比較差。因此,在求解某些問題時,常採用遞迴演算法來分析問題,用非遞迴演算法來求解問...