八數碼問題(bfs廣度優先搜尋)

2022-10-09 01:39:15 字數 2266 閱讀 2020

最近在學bfs,覺得這個題不錯,自己沒做出來,去網上搜了一下,又結合了我自己的想法,ac了;

這個看起來用dfs比較好做,但是會超時好像,所以肯定用bfs了。

問題描述

在九宮格裡放在1到8共8個數字還有乙個是x,與x相鄰的數字可以移動到x的位置,問給定的狀態最少需要幾步能到達目標狀態:

1 2 3

4 5 6

7 8 x

輸入

輸入乙個初始狀態;

輸出

到達目標狀態所需要的最少步數;

樣例

輸入:1 2 3

x 4 6

7 5 8

輸出:思路:

首先,可以根據輸入的初始狀態直接判斷此題是否有解,無解的情況直接輸出-1就ok了;

具體方法是:將輸入的九個數存到乙個一維陣列,假設f(1)為數字1在陣列位置中在1前面比1小的數,

f(2)為數字2在陣列位置中,在2前面比2小的數,.........,直到f(8),將f(1)+f(2).....到f(8)的值相加,

如果得到的數是偶數則有解,奇數則無解。

然後,將每個狀態的九宮格替換成乙個整數表示,例如樣例 123046758,x替換成0,然後用map,來儲存狀態是否被     訪問過,這樣只需遍歷0所在位置可以移動的方向,如果沒有出界的話,求出移動後的九宮格狀態,壓入佇列中,直到目標解,返回最少步數。具體實現請看**。

ac**:

1 #include2 #include3 #include4 #include5 #include6 #include7 #include8

#define inf 0x3f3f3f3f

9using

namespace

std;

10const

int n = 10000 + 10;11

int dx = ;

12int dy = ;

1314

int a[5][5], d[10

];15 mapvis; //

儲存九宮格狀態是否被訪問過

16 mapstep; //

儲存到達此狀態所需的最少步數

17int

px, py, lx, ly;

1819

bool check(int u, int v)

30//

cout << a[i][j] << " ";31}

32//

cout << "\n";33}

34//

cout << "\n";

3536

if (px >= 1 && px <= 3 && py >= 1 && py <= 3

) 39

else

return

false;40

}4142int move_to(int ax, int ay, int bx, int by) 51}

52return

val;53}

5455

int bfs(int k)

68for (int i = 0; i < 4; i++)

81cout << "\n";82}

*/83

//cout << "\n";

84 vis[pos_now] = 1

;85 step[pos_now] = step[t] + 1;86

q.push(pos_now);87}

88}89}

90}91return0;

92}9394

intmain()

107}

108//

求九宮格是否有解

109int rem = 0

;110

for (int i = 1; i <= 9; i++)

115}

116//

cout << x << "\n";

117if (rem % 2

) 120

else

124125

return0;

126 }

廣度優先搜尋 八數碼問題

給定乙個一幅圖和乙個起點s,回答 從s到給定的頂點v是否存在一條路徑?如果有,找出其中最短的那條 所含邊數最少 邊數最少,很自然想到從從經過1條邊能到達的節點有哪些?然後經過這些邊再到達的節點有哪些?這樣我不就能夠想出來最短的路徑了嗎?沒錯,這是非常簡單的想法,然而真正的廣度優先演算法也是這樣,簡單...

廣度優先搜尋解決八數碼問題

程式描述 基於盲目搜尋策略的寬度優先搜尋方法 include include include include include include include using namespace std define n 9 九宮格總數字 陣列定義 0 9階乘定義 const int jc n 1 0 9...

八數碼問題 廣度優先搜尋 列舉判重

const maxn 500000 type atp record s string time longint end var que array 0.maxn of atp head,tail,x longint now string 儲存進行操作後的字串 procedure print 判斷是否...