首页 > 其他分享 >AcWing 845.八数码

AcWing 845.八数码

时间:2022-09-06 21:44:37浏览次数:102  
标签:count 845 string int start 数码 dis find AcWing

题目链接: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 }

 

标签:count,845,string,int,start,数码,dis,find,AcWing
From: https://www.cnblogs.com/marswithme/p/16663413.html

相关文章

  • acwing3667. 切木棍
    acwing3667.切木棍题目链接:https://www.acwing.com/problem/content/description/3670/思路n如果是奇数,肯定无解n如果是偶数,就去看n/2可以怎么分为两份(1与n/2-1...........
  • acwing第67场周赛
    1.火柴棍数字原题链接:https://www.acwing.com/problem/content/4612/思路利用n根火柴拼成最大的数字数字位数越大,数字的值就越大1只用两根火柴就可以拼成,所以就看n根......
  • acwing第66场周赛
    1.判断奇偶原题链接:https://www.acwing.com/problem/content/4609/判断就就直接%2即可#include<iostream>usingnamespacestd;intmain(){strings;fo......
  • acwing语法基础课第二讲!
    课堂笔记倒是没有多少,这节的知识点不是很多。我在做题的时候遇见了好几个不会的,如下:scanf("%%"),这里面的%%虽然是两个%%但是呢,只能输出一个%,具体原理我不知道,但是我......
  • AcWing 802.区间和
    题目链接:https://www.acwing.com/problem/content/804/好像理解了,但又没完全理解....写个题解再好好理解一下。百度说:离散化,把无限空间中有限的个体映射到有限的空间中去......
  • acwing语法基础课第一讲
    这堂课主要讲的是输入输出,以及顺序语句。以上,是我的笔记,包括课堂笔记以及后来做题总结的知识点。我需要强调的是!啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊......
  • AcWing算法基础课---第三讲基础算法---01DFS和BFS
    DFSAcWing842.排列数字#include<iostream>usingnamespacestd;constintN=10;intn;intpath[N],st[N];voiddfs(intu){if(u==n){......
  • AcWing秋招每日一题——week4
    Mon题目有效的快速序列数目给你 n 笔订单,每笔订单都需要快递服务。请你统计所有有效的收件/配送序列的数目,确保第i个物品的配送服务 delivery(i)总是在其收件......
  • AcWing秋招每日一题——week3
    1、跳跃游戏题目给你一个整数数组 arr ,你一开始在数组的第一个元素处(下标为0)。每一步,你可以从下标 i 跳到下标 i+1、i-1或者j:i+1需满足:i+1<arr.l......
  • AcWing杯 - 第66场周赛
    比赛链接:[第66场周赛](竞赛-AcWing)先放代码,题解慢慢补AAcWing4606.奇偶判断#include<set>#include<map>#include<queue>#include<stack>#include<cmath>#i......