最近在學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 判斷是否...