1.1 專案目標和主要內容
3×3九宮棋盤,放置數碼為1 -8的8個棋牌,剩下乙個空格,通過數字向空格的移動來改變棋盤的布局。
1.2 專案的主要功能
根據給定初始布局(即初始狀態)和目標布局(即目標狀態),如何移動棋牌才能從初始布局到達目標布局,找到合法的過程序列。
2、 專案設計
2.1 專案總體框架
2.2 系統詳細設計
啟發式搜尋就是在狀態空間中的搜尋對每乙個搜尋的位置進行評估,得到最好的位置,再從這個位置進行搜尋直到目標。這樣可以省略大量無謂的搜尋路徑,提高了效率。在啟發式搜尋中,對位置的估價是十分重要的。採用了不同的估價可以有不同的效果。
啟發中的估價是用估價函式表示的,如:f(n) = g(n) + h(n)
其中f(n) 是節點n的估價函式,g(n)是在狀態空間中從初始節點到n節點的實際代價,h(n)是從n到目標節點最佳路徑的估計代價。在這裡主要是h(n)體現了搜尋的啟發資訊,因為g(n)是已知的。如果說詳細點,g(n)代表了搜尋的廣度的優先趨勢。但是當h(n) >> g(n)時,可以省略g(n),而提高效率。
(2)a*演算法過程:
(1). 把起點加入 open list 。
(2). 重複如下過程:
a. 遍歷open list ,查詢f值最小的節點,把它作為當前要處理的節點,然後移到close list中
b. 對當前方格的相鄰方格一一進行檢查,如果它是不可抵達的或者它在close list中,忽略它。否則,做如下操作:
□ 如果它不在open list中,把它加入open list,並且把當前方格設定為它的父親
□ 如果它已經在open list中,檢查這條路徑 ( 即經由當前方格到達它那裡 ) 是否更近。如果更近,把它的父親設定為當前方格,並重新計算它的g和f值。如果你的open list是按f值排序的話,改變後可能需要重新排序。
c. 遇到下面情況停止搜尋:
□ 把終點加入到了 open list 中,此時路徑已經找到了,或者
□ 查詢終點失敗,並且open list 是空的,此時沒有路徑。
(3). 從終點開始,每個方格沿著父節點移動直至起點,形成路徑。
#include
#include
using namespace std;
int const maxsize = 1000;
int const maxsteps = 100;
struct node;
int counth(int* status)
h = h + sqrt(pow((i % 3 - j % 3), 2) + pow((i / 3 - j / 3), 2));//歐式距離
}return h;}
int* right(int* s, int index)
temp = status[index + 1];
status[index + 1] = 0;
status[index] = temp;
return status;
}int* up(int* s, int index)
temp = status[index - 3];
status[index - 3] = 0;
status[index] = temp;
return status;
}int* down(int* s, int index)
temp = status[index + 3];
status[index + 3] = 0;
status[index] = temp;
return status;}/*
*篩選新節點
/**顯示移動過程
/void show_all(node node)
step++;
node = node->parent;//向上輸出
}cout << 「----------------------」 << endl;
cout << 「一共執行了:」 << total << 「步」 << endl;
cout << 「----------------------」 << endl;
for (i = step - 1; i >= 0; i–)
cout << 「----------------------」 << endl;}}
//判斷逆序數(不包含0)
int inverse_num(int a, int n) }}
return sum;}/*
主函式/
int main()
int s1 = inverse_num(status, 9);
int s2 = inverse_num(status0, 9);
cout << "初始狀態逆序數:" << s1 << endl;
cout << "目標狀態逆序數:" << s2 << endl;
if (!((s1 % 2) == (s2 % 2)))
begintime = clock();
for (i = 0; i < 9; i++) //判斷0節點位置
p = initnode(status, i, 0, null, 0); //獲得初始節點
open[o] = *p; //將初始節點放入open中
o++;
q = search();
if (!q)
cout << "無解" << endl;
else
show_all(q);
endtime = clock();
cout << "run time:" << endtime - begintime << "ms" << endl;
return 0;
基於C 的勇闖迷宮遊戲
一 使用說明 1.1 專案簡介 迷宮只有兩個門,乙個門叫入口,另乙個門叫出口。乙個騎士騎馬從入口進入迷宮,迷宮設定很多障礙,騎士需要在迷宮中尋找通路以到達出口。1.2 專案功能要求 可以採用二維陣列,回溯和遞迴或非遞迴加棧實現 也可以用bfs演算法 即圖的廣度優先搜尋演算法,又叫寬度優先搜尋演算法 ...
基於C 的勇闖迷宮遊戲
一 使用說明 1.1 專案簡介 迷宮只有兩個門,乙個門叫入口,另乙個門叫出口。乙個騎士騎馬從入口進入迷宮,迷宮設定很多障礙,騎士需要在迷宮中尋找通路以到達出口。1.2 專案功能要求 可以採用二維陣列,回溯和遞迴或非遞迴加棧實現 也可以用bfs演算法 即圖的廣度優先搜尋演算法,又叫寬度優先搜尋演算法 ...
小遊戲開發 迷宮(遞迴版)
前面我們寫到迷宮的普通版,那這篇文章就來寫一下如何用遞迴來實現!遞迴實現迷宮問題同普通版差不多,其中關鍵思路 初始化及列印地圖 建立位置結點類等與普通版一樣,只有判斷座標的合理性與尋找迷宮通路的方法不同而已。源 如下 include include using namespace std inclu...