先給上**
#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陣列中的該位置的...