我們在解決八數碼問題是,會關心乙個解空間的問題,比如我們進行了27步操作時,當前狀態有多少可能的方案呢?
統計解空間的大小,有助於我們更好的優化演算法。
我們可以利用廣度優先策略,來統計第n步的可能方案。
利用hash表來儲存可行方案,從而剔除重複方案。
利用回溯的方式,從第n步開始往起點回退,能回退到起點的方案就是可能性方案,記錄該方案。
下面就是我們統計八數碼問題進行到第27步以後,統計解空間大小的**:
#include
#include
#include
#include
using
namespace
std;
//向四個方向生成新的方案
int x_axis = ;
int y_axis = ;
/** *generate函式:生成新的一層解決方案
* *@param queue> myqueue, set> myset;
*/void generate(queue
> &nodes, set
> &states)
}//想四個方向拓展,首先得判斷能否拓展
for(int i = 0; i < 4; i++)}}
//將已經遍歷的點推出佇列
nodes.pop();
} //將佇列中標識分層的空向量刪除掉
nodes.pop();
//清空雜湊表
cout
}int main(int argc, char *argv)
//給定迴圈的次數
int times = 27;
//初始化佇列和雜湊表
queue
> nodes;
set > states;
nodes.push(goal);
states.insert(goal);
while(times--)
//輸出雜湊表的大小
cout
<<"搜尋空間大小為:"
0;}
A 演算法解決八數碼問題(C 版本)
八數碼問題也稱為九宮問題。在3 3的棋盤,擺有八個棋子,每個棋子上標有1至8的某一數字,不同棋子上標的數字不相同。棋盤上還有乙個空格,與空格相鄰的棋子可以移到空格中。要求解決的問題是 給出乙個初始狀態和乙個目標狀態,找出一種從初始轉變成目標狀態的移動棋子步數最少的移動步驟。關鍵之處 要維護兩個結構 ...
演算法篇 14 A 演算法解決八數碼問題
八數碼問題 在3 3的方格棋盤上,擺放著1到8這八個數碼,有1個方格是空的,其初始狀態如圖1所示,要求對空格執行空格左移 空格右移 空格上移和空格下移這四個操作使得棋盤從初始狀態到目標狀態。a 初始狀態 b 目標狀態 a 演算法實際是一種啟發式搜尋,所謂啟發式搜尋,就是利用乙個估價函式評估每次決策的...
A A 演算法解決八數碼問題(C 實現)
1.狀態圖搜尋 1.1搜尋樹 搜尋過程中經過的節點和邊按原圖的連線關係構成乙個樹型的有向圖,稱為搜尋樹。1.2搜尋方式 樹式搜尋 記錄搜尋過程中所經過的所有節點和邊 1.3路徑的獲得 樹式搜尋 反向求解 2.搜尋演算法 2.1 closed表和open表 closed表對樹式搜尋來說儲存的是正在成長...