亚洲精品亚洲人成在线观看麻豆,在线欧美视频一区,亚洲国产精品一区二区动图,色综合久久丁香婷婷

              當(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ù)立即開通 >