首页 > 其他分享 >P1379 八数码难题(BFS)

P1379 八数码难题(BFS)

时间:2022-12-23 18:24:33浏览次数:60  
标签:yy string int P1379 BFS xx 数码 dis

P1379 八数码难题

​ 八数码问题就是在 \(3\times 3\) 的棋盘上,摆有八个棋子,每个棋子上标有 1 至 8 的某一数字。棋盘中留有一个空格,我们用 0 来表示。给出一个初始局面,给出一个目标局面。请问从初始局面到目标局面的最小移动次数是多少。关于八数码问题的移动,洛谷中的Tips有提示。

思路:

​ 最小操作次数,我们把移动看成一次状态的转移,那么这就是一个最短路问题。将题意抽象为:每次 0 可以与其周围的任一棋子交换位置,我们直接用BFS来写就可以了。状态可以用一维的字符串来表示,但是转移的时候是需要借助到这个棋盘的二维结构的,看代码领会一下。

代码:

​ 体会一维和二维之间的转换。

#include <bits/stdc++.h>

using namespace std;
int d[4][2] = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
string ans = "123804765"; //题面给的

int bfs(string s)
{
    queue<string> q;
    unordered_map<string, int> dis; //记录最少操作次数并判重
    
    q.push(s);
    dis[s] = 0;
    
    while (q.size())
    {
        string t = q.front();
        q.pop();
        
        if(t == ans)    return dis[t];
        
        int distance = dis[t];
        int k = t.find('0');
        int x = k / 3, y = k % 3; //把一维的字符串展开成二维的矩阵
        
        for(int i = 0; i < 4; i++)
        {
            int xx = x + d[i][0], yy = y + d[i][1];
            if(xx >= 0 && xx < 3 && yy >= 0 && yy < 3)
            {
                swap(t[k], t[xx * 3 + yy]);
                if(!dis.count(t)) //若这个状态没有出现过
                {
                    q.push(t);
                    dis[t] = distance + 1;   
                }
                swap(t[k], t[xx * 3 + yy]); //回溯
            }
        }
    }
    return -1; //int函数中要防止未定义的行为。虽然题目明确说明了都可以到达目标状态,但是写代码要有鲁棒性
}

int main()
{
    string s;
    cin >> s;
    cout << bfs(s);
}

标签:yy,string,int,P1379,BFS,xx,数码,dis
From: https://www.cnblogs.com/DM11/p/17001294.html

相关文章

  • BFS,DFS算法
    算法题目  基础:1.数组2.字符串3.排序4.贪心5.递归6.循环7.滑窗8.栈9.进制转换10.位运算11.队列12.哈希表13.链表14.线性表15.二分查找......
  • 04-数码管动态显示
    #include"reg52.h"voiddelay(unsignedchari){ while(i--);}voidshowseg();voidmaindelay(unsignedchart){ while(t--) { showseg(); }}unsign......
  • 03-数码管静态显示
     #include"reg52.h"voiddelay(unsignedchari){ while(i--);}unsignedcharcodetable[]={ 0xc0,//0 0xf9,//1 0xa4,//2 0xb0,//3 0x99,//4 0x92,......
  • 搜索问题 DFS BFS
    搜索问题DFSBFSDFSdfs更多用于解决存在性问题和遍历性问题他可以很容易找到一个东西是否存在,比如说一条路径是否存在,不需要恢复现场也可以比较方便的展示所有的情况,......
  • 7段数码管绘制
    """7段数码管绘制"""importturtle,datetimedefdrawGap():#绘制数码管间隔turtle.penup()turtle.fd(5)defdrawLine(draw):#绘制单段数码管d......
  • 最简单的BFS走迷宫问题
    原题目链接:https://www.luogu.com.cn/problem/T279759?contestId=88579  题目背景人生辗转几十年,今天学长终于遇到了他的喜欢的女孩...题目描述在一个阴雨连绵的夜......
  • 神州数码正式加入openGauss社区
    社区新知8月16日,神州数码(中国)有限公司签署CLA(ContributionLicenseAgreement,贡献许可协议),正式加入openGauss社区。神州数码以“数字中国”为使命,锐意变革,砥砺前行,始终坚......
  • leetcode 139. 单词拆分(BFS 或者 DP)
    题目大意:给定一个非空字符串s和一个包含非空单词列表的字典wordDict,判定 s是否可以被空格拆分为一个或多个在字典中出现的单词。说明:拆分时可以重复使用字典中的单词。......
  • 蓝桥杯之单片机学习(三)——共阳数码管的静态显示
    文章目录​​一、训练任务​​​​二、训练重点​​​​三、训练准备​​​​3.1原理图展示​​​​3.2数字对照表​​​​3.3数码管分路​​​​3.4一些解释​​​​四......
  • 第五次测试 7段数码管绘制
    7段数码管绘制    请画出,系统时间。具体包括:年,月,日,小时,分,秒代码如下:#coding:utf-8#绘制七段数码管,显示当前时间importtimeimportturtleastt#绘制......