題目鏈接:https://www.acwing.com/problem/content/847/
一道bfs,主要是狀態(tài)和狀態(tài)轉(zhuǎn)換很難搞,看y總的代碼中,很多關(guān)于c++庫中的各種還不太熟悉,現(xiàn)學現(xiàn)賣了屬于。
一篇關(guān)于unordered_map的find和count函數(shù)使用總結(jié)的博客。
?
借鑒一下大佬的圖解
?其他放在代碼里講了
?
放AC代碼
1 #include<bits/stdc++.h> 2 using namespace std; 3 4 int bfs(string start) 5 { 6 queue<string> q; 7 unordered_map<string, int> d; 8 string end = "12345678x"; 9 int dx[4] = {0,0,1,-1}, dy[4] = {1,-1,0,0}; 10 11 q.push(start); 12 d[start] = 0;//初始化最初x的距離 13 while(q.size()) 14 { 15 auto t = q.front(); 16 q.pop(); 17 //記錄當前距離,如果是最終狀態(tài)則返回距離 18 int dis = d[t]; 19 if(t == end) return dis; 20 //查詢x在字符串中的下標,然后返回x在數(shù)組中的下標 21 int k = t.find('x');//find返回'x'的下標(從0開始) 22 int x = k/3, y = k%3; 23 24 for(int i=0; i<4; i++) 25 { 26 //求轉(zhuǎn)移后x的下標 27 int a = x+dx[i], b = y+dy[i]; 28 //如果當前狀態(tài)沒有越界 29 if(a >= 0 && a < 3 && b >= 0 && b < 3) 30 { 31 //轉(zhuǎn)換x 32 swap(t[k], t[a*3+b]); 33 //如果當前狀態(tài)是第一次遍歷,則入隊 34 if(!d.count(t))//count返回t的個數(shù) 35 { 36 q.push(t); 37 d[t] = dis + 1;//更新距離數(shù)組 38 } 39 //還原狀態(tài) 40 swap(t[k], t[a*3+b]); 41 } 42 } 43 } 44 return -1; 45 } 46 47 int main() 48 { 49 string c, start; 50 for(int i=0; i<9; i++) 51 { 52 cin >> c; 53 start += c; 54 } 55 cout << bfs(start) << endl; 56 return 0; 57 }
?
本文摘自 :https://www.cnblogs.com/