當(dāng)前位置:首頁 > IT技術(shù) > Windows編程 > 正文

AcWing 845.八數(shù)碼
2022-09-06 22:46:00

題目鏈接:https://www.acwing.com/problem/content/847/

一道bfs,主要是狀態(tài)和狀態(tài)轉(zhuǎn)換很難搞,看y總的代碼中,很多關(guān)于c++庫中的各種還不太熟悉,現(xiàn)學(xué)現(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         //記錄當(dāng)前距離,如果是最終狀態(tài)則返回距離
18         int dis = d[t];
19         if(t == end) return dis;
20         //查詢x在字符串中的下標(biāo),然后返回x在數(shù)組中的下標(biāo)
21         int k = t.find('x');//find返回'x'的下標(biāo)(從0開始)
22         int x = k/3, y = k%3;
23 
24         for(int i=0; i<4; i++)
25         {
26             //求轉(zhuǎn)移后x的下標(biāo)
27             int a = x+dx[i], b = y+dy[i];
28             //如果當(dāng)前狀態(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                 //如果當(dāng)前狀態(tài)是第一次遍歷,則入隊(duì)
34                 if(!d.count(t))//count返回t的個(gè)數(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/

開通會(huì)員,享受整站包年服務(wù)立即開通 >