搜尋:高階列舉經典八數碼問題:有順序有策略地列舉狀態空間中的節點,尋找問題 的解
狀態空間
由所有狀態構成的狀態樹
有乙個3*3的棋盤,其中有0-8共9個數字,0表示空 格,其他的數字可以和0交換位置。求由初始狀態 到達目標狀態的步數最少的解?8 2 3
1 4 6
5 7 0
—>
1 2 3
4 5 6
7 8 0
解析:
1。狀態空間
2.搜尋方法:bfs dfs
bfs:優先擴充套件淺層節點,逐漸深入。用佇列儲存待擴充套件的節點,從隊首隊取出節點,擴 展出的新節點放入隊尾,直到找到目標節點(問題 的解)
廣度優先搜尋**框架:
bfs
()}
dfs:優先深入遍歷靠前的節點。可以用棧實現,在棧中儲存從起始節點到當前節點 的路徑上的所有節點。一般用遞迴實現
深度優先搜尋**框架:
dfs()
}
狀態搜尋中的關鍵問題:判重:
新擴充套件出的節點如果和以前擴充套件出的節點相同,則 這個新節點就不必再考慮,如何判重?
狀態數目巨大,如何儲存?
怎樣才能較快的找到重複節點?
合理編碼,減小儲存代價。
演算法書上給出的方法有編碼解碼、雜湊技術、和使用stl中的集合set。可以用count()方法判重。
經過以上分析,可以寫出**:
#include
#include
#include
#include
#include
#include
#include
using
namespace
std;
typedef
int statues[9];
const
int maxstatues = 1000000;
statues myqueue[maxstatues], goal; //所有狀態的佇列和目標狀態
int dist[maxstatues];
const
int dx = ;
const
int dy = ;
set visited;
//判斷狀態s是否被訪問過
int is_not_visited(int s)
int bfs()
}front++;
} return
0;}
A 搜尋 八數碼問題
八數碼問題,簡單地來描述是這樣的 在乙個九宮格內,填有1 2 3 4 5 6 7 8,八個阿拉伯數字,有乙個格仔為空白。就下面這樣,這是乙個沒有歸位的九宮格。12 3784 65 未歸位的九宮格 對於上面這個九宮格,我們要通過移動數字來使之歸位,每次移動都只能是與空白格相鄰的數字移到空白格裡面。最終...
廣度優先搜尋 八數碼問題
給定乙個一幅圖和乙個起點s,回答 從s到給定的頂點v是否存在一條路徑?如果有,找出其中最短的那條 所含邊數最少 邊數最少,很自然想到從從經過1條邊能到達的節點有哪些?然後經過這些邊再到達的節點有哪些?這樣我不就能夠想出來最短的路徑了嗎?沒錯,這是非常簡單的想法,然而真正的廣度優先演算法也是這樣,簡單...
八數碼問題 啟發式搜尋
一 問題描述 在乙個3 3 的方棋盤上放置著 1,2,3,4,5,6,7,8 八個數碼 每個數碼佔一格 且有乙個空格。這些數碼可以在棋盤上移動,其移動規則是 與空格相鄰的數碼方格可以移入空格。現在的問題是 對於指定的初始棋局和目標棋局,給出數碼的移動序列。該問題稱八數碼難題或者重排九宮問題。原始碼 ...