搜尋 八數碼問題

2021-07-13 13:54:00 字數 1490 閱讀 4592

搜尋:高階列舉

有順序有策略地列舉狀態空間中的節點,尋找問題 的解

狀態空間

由所有狀態構成的狀態樹

經典八數碼問題:

有乙個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 八個數碼 每個數碼佔一格 且有乙個空格。這些數碼可以在棋盤上移動,其移動規則是 與空格相鄰的數碼方格可以移入空格。現在的問題是 對於指定的初始棋局和目標棋局,給出數碼的移動序列。該問題稱八數碼難題或者重排九宮問題。原始碼 ...