八數碼遊戲分析 原始碼 啟發式搜尋(一)

2021-05-26 21:20:57 字數 2461 閱讀 1718

八數碼問題:

圖1.1(左邊為開始格局,右邊為移動後最終格局)

圖1.2

如果按正常的思維,採用盲目搜尋的話,不僅搜尋的次數多,而且往往容易陷入死迴圈中,所以面對此問題需要一種策略——啟發式搜尋

啟發式搜尋:啟發式搜尋就是在狀態空間中的搜尋對每乙個搜尋的位置進行評估,得到最好的位置,再從這個位置進行搜尋直到目標。這樣可以省略大量無謂的搜尋路徑,提高了效率

解決此問題的啟發策略:

每次移動的時候,正確位置數碼的個數要大於交換前正確位置數碼個數。

正確位置數碼個數:每個數碼的位置與最終格局的對比,如果位置相同,則說明此數碼在正確位置。

如下圖:

圖1.3

圖1.3中右邊為最終格局,左邊為當前格局,紅色字型標識的數碼為 正確位置數碼,由此可以發現其正確位置的數碼個數為4個。那麼圖1.2中正確數碼如下圖所示:

這樣一步步的最終即可得到最終格局

源**:

/*

程式名:八數碼問題

描述:主要函式列表:

1.show() 顯示當前待調整數碼矩陣

2.exchange() 交換數碼中的 begin[row_one][column_one] 與 begin[row_two][column_two] 這兩個數

3.judge() 判斷待調整的數碼與最終數碼相比正確位置數碼的個數

4.yidong() 將待調整數碼從開始位置移動到終止位置,並將其過程輸出

5.shuru() 有使用者輸入待調整的數碼矩陣最初狀態的數,並將其存入到begin陣列中

其它說明:此程式運用到啟發式搜尋的策略,

(1):將空格的地方儲存零,這樣便於操作

(2):每次交換0上下左右4個方向元素的位置,當交換位置後正確數碼個數 大於或等於 交換前正確數碼的個數則算交換成功,

交換成功則重複步驟2,失敗的話則跳回上一輪交換。

(3):當交換到最終所有的數碼的位置都正確時結束

*/#include"stdio.h"

#define num 3 //巨集定義數碼的行列數為3

/*顯示當前待調整數碼矩陣*/

void show(int begin[num][num])

printf("\n");

}/*交換數碼中的 begin[row_one][column_one] 與 begin[row_two][column_two] 這兩個數*/

void exchange(int begin[num][num], int row_one, int column_one, int row_two, int column_two)

/*判斷待調整的數碼與最終數碼相比正確位置數碼的個數*/

int judge(int begin[num][num], int end[num][num])

return count; //返回數碼中正確位置的個數}

/* 將待調整數碼從開始位置移動到終止位置,並將其過程輸出*/

int yidong(int begin[num][num], int end[num][num]

, int right, int jishu, int ji_shu[50][3][3]

, int biaoji, int row, int column) //biaoji儲存上一輪移動的反方向代號

} if(column > 0 && biaoji != 1) }

if(row < num-1 && biaoji != 2) }

if(column < num-1 && biaoji != 3) }

return 0; //移動失敗,返回0

}/*有使用者輸入待調整的數碼矩陣最初狀態的數,並將其存入到begin陣列中*/

void shuru(int begin[num],int blank)

if(temp < 0 || temp > num*num-1) //當輸入的值不是在數碼的區間範圍內時,提示重新輸入

if(node == 1) //如果輸入滿足條件

begin[i][j] = temp;//將滿足條件的值儲存起來}}}

int main()

; //給最終狀態的數碼矩陣賦值

printf ("-------%d數碼遊戲開始!--------\n", num);

shuru(begin, blank); //輸入帶調整狀態的數碼矩陣的值

row = blank[0];

column = blank[1];

if(yidong (begin, end,judge(begin,end),jishu,ji_shu,4,row,column) == 0)

printf("\n此8數碼的問題可能無解!");

else

show(begin);

getchar();getchar();

return 0;

}

八數碼問題 啟發式搜尋

一 問題描述 在乙個3 3 的方棋盤上放置著 1,2,3,4,5,6,7,8 八個數碼 每個數碼佔一格 且有乙個空格。這些數碼可以在棋盤上移動,其移動規則是 與空格相鄰的數碼方格可以移入空格。現在的問題是 對於指定的初始棋局和目標棋局,給出數碼的移動序列。該問題稱八數碼難題或者重排九宮問題。原始碼 ...

八數碼問題 啟發式搜尋

我們在搜尋的時候往往會發現一些資料會導致我們的普通的深搜與廣搜都無法通過,那這個時候我們就需要讓起點與終點建立一些聯絡,今天我們講述的啟發式搜尋就是在廣度優先搜尋的基礎上加了這樣乙個優化,叫做估價函式。對於乙個狀態,在我們知道終點狀態的時候,我們可以設計乙個估價函式使我們對這個狀態距離終點的距離有個...

A 啟發式搜尋 八數碼問題

a 啟發式搜尋 include iostream include stdlib.h include conio.h include include define size 3 using namespace std 定義二維陣列來儲存資料表示某乙個特定狀態 typedef int status si...