馬踏棋盤貪心優化非遞迴走全部路

2021-10-10 05:48:49 字數 2534 閱讀 4872

先給上**

#include

#include

#include

#include

#include

#include

using

namespace std;

struct postype

postype operator+(

const postype& t)};

struct datatype

;int m_board[8]

[8];

postype direct[8]

=,,,

,,,,

};int n=0;

bool

limit

(const postype &t)

void

print()

}inline

void

nextpos

(datatype & r)m[8

];int k=0;

for(

int i=

0;i<

8;i++

)else k++;}

sort

(m,m+8,

(const temp &i,

const temp &j));

for(

int i=k;i<

8;i++

) r.next[i]

=m[i]

.b; r.di=k;

}int

main()

cout<<

"是否輸出到檔案output.txt,是請輸入1,否輸出0"

cin>>k;

if(k)

freopen

("output.txt"

,"w"

,stdout);

if(!t)return0;

datatype temp;

memset

(m_board,0,

sizeof

(m_board));

dobreak;}

nextpos

(s.top()

);}else

if(s.

empty()

)break

; s.

top(

).di++

; temp=s.

top();

curpos=temp.seat+direct[temp.next[temp.di-1]

];}}

while

(!s.

empty()

);if(t^n) cout<<

"沒有這麼多條路徑"

;getchar()

;return0;

}

postype表示座標含有x和y,datatype表示

先說非遞迴的思路,其實很簡單if裡面是下一層,else裡面是本層,然後di記錄走到了第幾個方向(一共8個方向),每走乙個方向di++,這樣就不會走重複的方向了。這裡附上核心**

do

}else

if(s.

empty()

)break

; s.

top(

).di++

; curpos=s.

top(

).seat+direct[s.

top(

).di-1]

;}}while

(!s.

empty()

);

從這裡的**可以看出整體的架構,就是模擬遞迴的棧狀態

再來說一下全部路的思路,加乙個goto就能夠在pop的同時回到上一層,當然這個最優方法應該不是只回到上一層,為了**的閱讀性,我就只回返了一層。

再到貪心優化的思路,假設我們每乙個馬兒位置,有n個位置可以繼續走,我們此時不知道這n個位置能否成功走完棋盤,那麼設每個位置的完成概率是相等的p(n*p=1),但是我們可以確定每個位置的完成時間

(完成時間=成功時間×成功概率+失敗時間×失敗概率,成功概率和失敗概率是相等的,但是時間不等,成功都為走完,而失敗則是走到沒路,深度不確定)

大小,n個位置的完成時間,依次為t1,t2,…tn,…,

此時我們可以看到走n1和n2位置成功與走n3和n4的總成功率是相等的,但是總完成時間是不等,

我們為了效率,在獲取相同成功率的情況下,總完成時間越短則效率越高,所以我們要選失敗時間可能最短的,即可能的深度最小的,所以我們從固定順序中選取方向,變為了每次下乙個方向是出口最少的方向,實現起來也很簡單,看nextpos即可,找到出口數量就公升序排序,這裡又有乙個優化,就是判斷是不是下個方向是否能走,不能走k++,這樣前面的0出口的方向序號就不用賦值給next陣列了,然後讓di=k相當於已經走過前面k種了。

好了這三種思路連起來就是最後的**啦,最後兩個getchar()是為了防止程式執行時控制台自動關閉

馬踏棋盤的貪心優化

資料結構上機時發現有乙個優化馬踏棋盤的方法。僅適用於優化求解乙個 或少數 對於求所有解時間不變。即dfs查詢路徑時優先選擇孫節點少的子節點。下面附上 include include include include using namespace std struct node int map 10 ...

馬踏棋盤之貪心演算法優化

問題描述 曾經用簡單的深度優先搜尋方法 遞迴的形式對馬踏棋盤進行搜尋,執行效率不甚理想。部落格見馬踏棋盤之遞迴實現 所以現在用貪心演算法將其優化了一下。問題解析 主要的思想沒有變,還是用深度優先搜尋,只是在選下乙個結點的時候做了貪心演算法優化,其思路如下 從起始點開始,根據 馬 的走法,它的下一步的...

馬踏棋盤及其優化

在8 8的西洋棋棋盤中的任何乙個位置,放置乙個馬 棋子 使其按照馬在西洋棋中的規則 走日 進行移動,求其中的乙個解。這其實是乙個深度優先搜尋的問題,深度優先搜尋一般使用遞迴實現,在這裡,為了學習,使用我們更不熟悉的棧來操作。1.給定乙個起點,將起點入棧,步數step 1。2.在map陣列中的該位置的...