馬踏中國象棋棋盤的貪心算法

    今天上午在網上看到了一篇介紹馬踏棋盤的貪心算法的文章,就想照着把它實現。可是寫到一半,發現原文好像是國際象棋的棋盤。對國際象棋的規則一竅不通,所以就硬着頭皮按中國象棋的規則來寫。還真的寫出來了。

 

【問題描述】(國際象棋)
馬的遍歷問題。在8×8方格的棋盤上,從任意指定方格出發,爲馬尋找一條走遍棋盤每一格並且只經過一次的一條路徑。

【問題描述】(中國象棋)
馬的遍歷問題。在9×10方格的棋盤上,從任意指定點出發,爲馬尋找一條走遍棋盤每一點並且每點只經過一次的一條路徑。

 

下面是引用原文的關於貪心算法的介紹:

【貪心算法】
其實馬踏棋盤的問題很早就有人提出,且早在1823年,J.C.Warnsdorff就提出了一個有名的算法。在每個結點對其子結點進行選取時,優先選擇‘出口’最小的進行搜索,‘出口’的意思是在這些子結點中它們的可行子結點的個數,也就是‘孫子’結點越少的越優先跳,爲什麼要這樣選取,這是一種局部調整最優的做法,如果優先選擇出口多的子結點,那出口少的子結點就會越來越多,很可能出現‘死’結點(顧名思義就是沒有出口又沒有跳過的結點),這樣對下面的搜索純粹是徒勞,這樣會浪費很多無用的時間,反過來如果每次都優先選擇出口少的結點跳,那出口少的結點就會越來越少,這樣跳成功的機會就更大一些。這種算法稱爲爲貪心算法,也叫貪婪算法或啓發示算法,它對整個求解過程的局部做最優調整,它只適用於求較優解或者部分解,而不能求最優解。這樣的調整方法叫貪心策略,至於什麼問題需要什麼樣的貪心策略是不確定的,具體問題具體分析。實驗可以證明馬遍歷問題在運用到了上面的貪心策略之後求解速率有非常明顯的提高,如果只要求出一個解甚至不用回溯就可以完成,因爲在這個算法提出的時候世界上還沒有計算機,這種方法完全可以用手工求出解來,其效率可想而知。
下面是我用C#實現的代碼。

 

 

以下是運行的效果:

 

算是做出來了。可是想想這個樣子不太直觀,所以我就又在winform上畫了幅棋盤,然後把經過的路徑都畫出來。爲了看清效果,就定了個時間,每隔一秒鐘畫一條線。因爲我不會做flash,所以只能把最終的圖發給大家看看。

畫圖的程序:

 

最終的效果圖如下:

效果圖

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章