AcWing 845.八数码

题目链接:https://www.acwing.com/problem/content/847/

一道bfs,主要是状态和状态转换很难搞,看y总的代码中,很多关于c++库中的各种还不太熟悉,现学现卖了属于。

一篇关于unordered_map的find和count函数使用总结的博客。


 

借鉴一下大佬的图解

 其他放在代码里讲了


 

放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         //记录当前距离,如果是最终状态则返回距离
18         int dis = d[t];
19         if(t == end) return dis;
20         //查询x在字符串中的下标,然后返回x在数组中的下标
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             //求转移后x的下标
27             int a = x+dx[i], b = y+dy[i];
28             //如果当前状态没有越界
29             if(a >= 0 && a < 3 && b >= 0 && b < 3)
30             {
31                 //转换x
32                 swap(t[k], t[a*3+b]);
33                 //如果当前状态是第一次遍历,则入队
34                 if(!d.count(t))//count返回t的个数
35                 {
36                     q.push(t);
37                     d[t] = dis + 1;//更新距离数组
38                 }
39                 //还原状态
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 }

 

posted @ 2022-09-06 21:38  爱吃虾滑  阅读(30)  评论(0编辑  收藏  举报