貪心演算法 馬踏棋盤(C)

2021-06-27 08:27:15 字數 2469 閱讀 1005

貪心演算法

(又稱貪婪演算法)是指,在對

問題求解

時,總是做出在當前看來是最好的選擇。也就是說,不從整體最優上加以考慮,他所做出的僅是在某種意義上的區域性

最優解。貪心演算法不是對所有問題都能得到整體

最優解,但對範圍相當廣泛的許多問題他能產生整體最優解或者是整體最優解的近似解。

貪婪演算法是一種改進了的分級處理方法。其核心是根據題意選取一種量度標準。然後將這多個輸入排成這種量度標準所要求的順序,按這種順序依次輸入乙個量。如果這個輸入和當前已構成在這種量度意義下的部分最佳解加在一起不能產生乙個

可行解,則不把此輸入加到這部分解中。這種能夠得到某種量度意義下最優解的分級處理方法稱為貪婪演算法。

對於乙個給定的問題,往往可能有好幾種量度標準。初看起來,這些量度標準似乎都是可取的,但實際上,用其中的大多數量度標準作貪婪處理所得到該量度意義下的最優解並不是問題的最優解,而是次優解。因此,選擇能產生問題最優解的最優量度標準是使用貪婪演算法的核心。

一般情況下,要選出最優量度標準並不是一件容易的事,但對某問題能選擇出最優量度標準後,用貪婪演算法求解則特別有效。

最優解可以通過一系列區域性最優的選擇即貪婪選擇來達到,根據當前狀態做出在當前看來是最好的選擇,即區域性最優解選擇,然後再去解做出這個選擇後產生的相應的子問題。每做一次貪婪選擇就將所求問題簡化為乙個規模更小的子問題,最終可得到問題的乙個整體最優解。

看完了概念,好像還是有點模糊,用乙個例子來更深層次的理解下吧。

馬踏棋盤問題:

思路:首先將棋盤當做乙個二維陣列,然後將陣列的每乙個值賦值為0,將馬的起始位址設為1,比如說是5,6,然後判斷當前馬所能夠到達的地方,找出這些點,通過乙個陣列,陣列中的值記錄馬下乙個位置和當前位置之間的差值,然後遍歷一遍陣列,檢測其下乙個位置是否還在棋盤之中,是否走過該位置,然後將其走過的點記錄下來,將所獲得的這些點的記錄進行遍歷,遍歷每乙個點,看一下這些點是否還可以繼續向下走,然後將這些點可以向下走的位置有幾個記錄下來,找到路徑最少的乙個點,然後將這個點設為初始點,進入下一次遍歷,這裡個乙個問題就是為什麼要找剩餘路徑最少的點呢?而不是去找路徑多的,或者是隨機的呢,原因就是路勁少的點,到達它的點就少了,如果這次沒有選擇這個點的話,下次再來這個點就會變得困難,甚至是不可以走了。開始寫的乙個老是走到一半就會停止了,不能夠繼續前進了,不知道是什麼原因,搞了一晚上的時間,有種把電腦砸了的衝動,最終發現原因竟然是那麼簡單的,很基礎的一點關於c的問題,看來c好久不看,確實是不可以了。

實現**例項:

# include # include # include # define rows 8

# define cols 8

int cheesboard [rows] [cols];

const int movex [8] = ;

const int movey [8] = ;

//初始化棋盤,將棋盤所有的位置賦值為0

void initboard (int board[cols]) }}

//從待選的下乙個點的集合中路徑最短的乙個

int getminpath (int a,int num)

}for(i = index + 1; i < num ; i++)

}if(a[index] > 0)

return index;

return -1;

}// 列印路徑

void printpath (int board[cols])

printf("\n\n"); }}

// 獲得馬行走的路徑

void getpath (int board [cols], int startx, int starty);

//下乙個位置的在二維陣列中對應位置,初始為0

int nextx[8] = ;

int nexty[8] = ;

//第乙個位置賦值為1

board [startx] [starty] = 1;

int m,i,j;

//走完所有的點要迴圈63次

for ( m = 1; m < 64; m++)

//如果可以向下乙個位置移動的話,通過next陣列儲存下來,通過next記錄下有多少個

nextx [next] = startx + movex[i];

nexty [next] = starty + movey[i];

next ++;

} //迴圈結束之後,對next的值進行判斷,當為1的時候

if (next == 1)

//無法向下乙個位置移動了

else if (next == 0)

else

else

}set_nextpoint:

startx = nextx[min];

starty = nexty[min];

board[startx][starty] = m+1;

}print_path:

printpath(board);

}int main ()

馬踏棋盤的貪心演算法

問題描述 馬的遍歷問題。在 方格的棋盤上,從任意指定方格出發,為馬尋找一條走遍棋盤每一格並且只經過一次的一條路徑。初步設計 首先這是乙個搜尋問題,運用深度優先搜尋進行求解。演算法如下 輸入初始位置座標x,y 步驟 c 如果c 64輸出乙個解,返回上一步驟c x,y c 計算 x,y 的八個方位的子結...

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

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

資料結構 馬踏棋盤題解(貪心演算法)

使用迴圈建立棋盤與權值棋盤 權值為該位置可走的位置數量 將當前步數寫入棋盤陣列中 開始探測下一步該走的位置,分別測試八個方向 對可走位置進行查詢權值,將權值最少的作為下一步的位置 每次都將步數最少的可走位置作為下一步的位置即貪心的體現 迴圈2 4。馬踏棋盤 貪心題解 include include ...