【BFS】AcWing845. 八數碼
阿新 • • 發佈:2022-05-24
AcWing845.八數碼
題解
還是一道bfs標準題,每次存入4個方向的狀態,直到找到最終狀態
#include <iostream> #include <cstdio> #include <unordered_map> #include <queue> using namespace std; int dir[4][2] = {1,0 ,-1,0 ,0,1, 0,-1}; queue<string> q; unordered_map<string, int> dist; int BFS(string start) { string end = "12345678x"; q.push(start); dist[start] = 0; int x, y, pos, xx, yy, distance; while(q.size()) { string t = q.front(); distance = dist[t]; q.pop(); if(t == end) return dist[t]; pos = t.find("x"); x = pos / 3, y = pos % 3; for(int i = 0; i < 4; ++i) { xx = x + dir[i][0], yy = y + dir[i][1]; if( xx >= 0 && xx < 3 && yy >= 0 && yy < 3) { swap(t[xx * 3 + yy], t[pos]); if(!dist.count(t)) { q.push(t), dist[t] = distance + 1; } swap(t[xx * 3 + yy], t[pos]); //恢復原形,用於下次計算 } } } return -1; } int main() { string s; char c; for(int i = 0; i < 9; ++i) cin >> c, s += c; cout << BFS(s) << endl; return 0; }