首页 > 编程语言 >【c++基础】八数码难题

【c++基础】八数码难题

时间:2024-06-07 19:33:41浏览次数:22  
标签:难题 wt int 样例 c++ 空格 数码 str include

说明

在 3×3 的棋盘上,摆有八个棋子,每个棋子上标有 1 至 8 的某一数字。棋盘中留有一个空格,空格用 0 来表示。空格周围的棋子可以移到空格中。要求解的问题是:给出一种初始布局(初始状态)和目标布局(为了使题目简单,设目标状态为 123804765),找到一种最少步骤的移动方法,实现从初始布局到目标布局的转变。如果无解则输出-1

输入数据

输入初始状态,一行九个数字,空格用 0 表示。

输出数据

只有一行,该行只有一个数字,表示从初始状态到目标状态需要的最少移动次数。保证测试数据中无特殊无法到达目标状态数据。

如果无解则输出-1

样例

输入样例

283104765

输出样例

4

样例解释

题解

# include <bits/stdc++.h>
#include <queue>
#include <variant>
using namespace std;
struct stru
{
    string st;
    int num,wt;
};
int wt,dir[]={0,3,-3,1,-1};
string str;
queue <stru> q;
map <string,bool> mp;
void bfs()
{
    q.push((stru){str,0,wt});
    mp[str]=1;
    while (!q.empty())
    {
        stru s=q.front();
        q.pop();
        if (s.st=="123804765")
        {
            cout<<s.num;
            return ;
        }
        for (int u=1;u<=4;u++)
        {
            int ux=dir[u]+s.wt;
            if (u==3||u==4)
                if (ux/3!=s.wt/3)
                    continue;
            if (ux>=0&&ux<=8)
            {
                swap(s.st[ux],s.st[s.wt]);
                if (!mp[s.st])
                {
                    mp[s.st]=1;
                    q.push((stru){s.st,s.num+1,ux});
                }
                swap(s.st[ux],s.st[s.wt]);
            }
        }
    }
    cout<<-1;
}
int main()
{
    cin>>str;
    for (int u=0;u<10;u++)
        if (str[u]=='0')
            wt=u;
    bfs();

    return 0;
}

标签:难题,wt,int,样例,c++,空格,数码,str,include
From: https://blog.csdn.net/2301_79396857/article/details/139534173

相关文章

  • c++入门笔记——头文件
    【头文件】c++中,一个程序开头必有头文件。头文件有许多个,它们的关系是并列的。<algorithm>:包含STL通用算法。<bitset>:包含bitset类模板。<cassert>:包含断言宏,如assert。<cctype>:包含字符处理函数。<cerrno>:定义错误码变量errno。<cfenv>:提供有关浮点环境的操作。......
  • [C++] 小游戏 能量1.0.2版本 zty出品
    大家好,欢迎来到今天的代码。我很荣幸能够在这里与大家见面。今天我想向大家介绍的是能量1.0.2版本。本次主要更新了人工智障的智商,没有以前那么笨了。先赞后看养成习惯CODE#include<bits/stdc++.h>#include<windows.h>usingnamespacestd;intrgzz(intlun,intdineng,......
  • c++ 静态成员的初始化 友元模板
     来自:https://www.cnblogs.com/fre2technic/archive/2011/03/25/1995044.html 我们定义如下类://A.hclass A{private:    static const int m = 5;    static int n;    static vector<int> buf;};其中包含三个私有的静态类成员,C++规定const静态......
  • C++数据结构之:哈希表Hash
    摘要:  it人员无论是使用哪种高级语言开发东东,想要更高效有层次的开发程序的话都躲不开三件套:数据结构,算法和设计模式。数据结构是相互之间存在一种或多种特定关系的数据元素的集合,即带“结构”的数据元素的集合,“结构”就是指数据元素之间存在的关系,分为逻辑结构和存储......
  • C++数据结构之:图Graph
    摘要:  it人员无论是使用哪种高级语言开发东东,想要更高效有层次的开发程序的话都躲不开三件套:数据结构,算法和设计模式。数据结构是相互之间存在一种或多种特定关系的数据元素的集合,即带“结构”的数据元素的集合,“结构”就是指数据元素之间存在的关系,分为逻辑结构和存储结......
  • C/C++ 联合体的注意事项
    联合体(Union)在C/C++中是一个特殊的数据类型,它允许在相同的内存位置存储不同的数据类型。联合体的主要特点是,其所有的成员共享同一块内存区域,也就是说,联合体中的各个成员首地址都是相同的。这使得联合体在节省内存、进行数据类型转换等方面非常有用。然而,使用联合体时也需要注意......
  • C++ 模板
    一.非类型模板参数模板参数分为类型形参与非类型形参。类型形参:类作为模板参数,typename/classT(T就是类型形参)非类型形参:内置类型作为模板参数,intdoublechar...(在C++20前只有int可以传)这样我们就可以随便定义栈的大小。注:因为n是常量所以是不能修改的。......
  • 免费,C++蓝桥杯比赛历年真题--第14届蓝桥杯省赛真题(含答案解析和代码)
    C++蓝桥杯比赛历年真题–第14届蓝桥杯省赛真题一、选择题答案:A解析:C++中bool类型与char类型一样,都需要1byte。一些其他类型的占用字节数:short:2byte,int:4byte,longlong:8byte,double:8byte,故答案为A。答案:C解析:A中结构体中可以定义成员变量,也可以定义只有该结......
  • 10_1、C++继承与派生:声明与继承关系
    声明与继承关系继承派生概念派生类声明派生类从基类继承的过程吸收基类成员修改基类成员添加新成员继承关系公有继承保护继承私有继承继承派生概念类的继承就是新类由已经存在的类获得已有特性。类的派生则是由已经存在的类产生新类的过程。由已有类产生新类时,新......
  • 【NOI】C++程序结构入门之循环结构二-for循环
    文章目录前言一、for循环1.导入2.语法3.使用场景4.条件控制5.小结二、例题讲解问题:1264-4位反序数问题:1085-寻找雷劈数问题:1057-能被5整除且至少有一位数字是5的所有整数的个数问题:1392-回文偶数?问题:1090-同因查找问题:1446.人口增长问题三、总结四、感谢......