八数码题解

news2024/11/23 13:30:22

179. 八数码 - AcWing题库

首先要明确八数码问题的小结论,当原始序列中逆序对数列为奇数时一定无解,反之一定有解。

解法一:BFS+A*

首先思考用纯BFS解决这个问题。

大致的框架就是:

队列q,状态数组dist,上个状态prev
while(q.size())
{
    int t=q.front();
    q.pop();
    if(t==目标) break;
    找出x的位置
    for(枚举x在上下左右四个方向移动)
    {
        if(超出范围) continue;
        if(当前状态没被遍历||当前距离<之前距离)
        {
            q.push(当前状态);
            更新dist;
        }
    }
}

while(end!=start)
{
    遍历前序状态数组记录操作;
}
输出

这样子会超时。其实有点不明白为什么会超时,状态数是9!,1e5级别的,我算错了吗?

然后思考,可以用A*优化,其实就是加一个代价函数。

代价函数如下:

int f(string state)
{
    计算state到目标状态的曼哈顿距离
}

ac代码:

#include<iostream>
#include<vector>
#include<algorithm>
#include<queue>
#include<unordered_map>
using namespace std;
#define x first
#define y second
int dx[4]={-1,1,0,0},dy[4]={0,0,-1,1};
char op[5]={'u','d','l','r'};
string tag="12345678x";
string str;
int f(string s)
{
    int res=0;
    for(int i=0;i<9;i++)
    {
        if(s[i]!='x')
        {
            int t=s[i]-'1';
            res+=abs(t/3-i/3);
            res+=abs(t%3-i%3);
        }
    }
    return res;
}
void bfs(string s)
{
    unordered_map<string,int> dist;
    unordered_map<string,pair<string,char>> prev;
    priority_queue<pair<int,string>,vector<pair<int,string>>,greater<pair<int,string>>> q;
    
    q.push({f(s),s});
    dist[s]=0;
    while(q.size())
    {
        auto t=q.top();
        q.pop();
        string state=t.y;
        int step=dist[state];
        if(state==tag) break;
        int x=-1,y=-1;
        for(int i=0;i<9;i++)
            if(state[i]=='x')
            {
                x=i/3,y=i%3;
                break;
            }
        for(int i=0;i<4;i++)
        {
            int cx=x+dx[i],cy=y+dy[i];
            if(cx<0||cx>=3||cy<0||cy>=3) continue;
            string temp=state;
            swap(temp[3*x+y],temp[3*cx+cy]);
            if(!dist.count(temp)||dist[temp]>step+1)
            {
                dist[temp]=step+1;
                q.push({dist[temp]+f(temp),temp});
                prev[temp]={state,op[i]};
            }
        }
    }
    vector<char> res;
    while(tag!=s)
    {
        res.push_back(prev[tag].y);
        tag=prev[tag].x;
    }
    reverse(res.begin(),res.end());
    for(int i=0;i<res.size();i++) cout<<res[i];
}
int main()
{
    char c;
    while(cin>>c) str+=c;
    int cnt=0;
    for(int i=0;i<9;i++)
        for(int j=i+1;j<9;j++)
        {
            if(str[i]=='x') i++;
            if(str[j]=='x') j++;
            if(str[i]-'1'>str[j]-'1') cnt++;
        }
    if(cnt%2) cout<<"unsolvable";
    else bfs(str);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1510972.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

(ConvE)Convolutional 2D Knowledge Graph Embeddings

论文地址:https://arxiv.org/pdf/1707.01476.pdf 一、研究领域 知识图谱受限于知识构建方式的不足,常常伴随着不完备的特点,因此需要知识推理和补齐技术,来根据已有的事实来合理推断出新的事实以补充知识图谱,使其更完备。链路预测任务是知识推理和补齐技术的主要手段,用…

Python 导入Excel三维坐标数据 生成三维曲面地形图(面) 4-1、线条平滑曲面(原始图形)

环境和包: 环境 python:python-3.12.0-amd64包: matplotlib 3.8.2 pandas 2.1.4 openpyxl 3.1.2 scipy 1.12.0 代码: import pandas as pd import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D from scipy.interpolate import griddata fro…

数据分析实战-Python实现博客评论数据的情感分析

数据分析实战-Python实现博客评论数据的情感分析 学习建议SnowNLP基础什么是SnowNLP&#xff1f;SnowNLP情感分析 SnowNLP使用SnowNLP安装情感分析中文分词关键词提取拼音、词性标准 SnowNLP实战-博客评论数据的情感分析数据准备数据获取数据分析 总结 学习建议 现在很多网站、…

SpringBoot整合阿里云文件上传OSS以及获取oss临时访问url

SpringBoot整合阿里云文件上传OSS 1. 引入相关依赖<!--阿里云 OSS依赖--><dependency><groupId>com.aliyun.oss</groupId><artifactId>aliyun-sdk-oss</artifactId><version>3.10.2</version></dependency><dependen…

【MySQL】超详细_数据库的约束_MySQL的详细查询

复习前面MySQL的基础操作&#xff0c;目的是让我们有印象&#xff01;&#xff01;在这篇文章中&#xff0c;我主要写的是数据库的约束和查询操作的详细、深入讲解&#xff01; 基础操作 &#xff08;复习->【MySQL】超详细-基础操作&#xff09; 插入 insert -> inser…

https代理相对socks5代理有什么优势?

随着互联网的快速发展&#xff0c;代理服务已成为许多人在访问敏感或地理位置受限的网站时所依赖的工具。其中&#xff0c;HTTPS代理和SOCKS5代理是两种最常用的代理服务类型。本文将探讨HTTPS代理相对SOCKS5代理的优势。 1、安全性 HTTPS代理使用SSL/TLS协议对客户端和代理服…

C++ 矩形类

思维导图&#xff1a; #include <iostream> using namespace std; class Rect { private:int width;int height; public:void init(int w,int h){widthw;heighth;}void set_w(int w){widthw;}void set_h(int h){heighth;}void show(){cout << "perimeter &qu…

基于51单片机的LED点阵显示屏设计

目录 摘要 II Abstract III 第一章 绪论 1 1.1 课题背景 1 1.2 选题意义 1 1.3 论文主要内容 1 第二章 方法论证对比 3 2.1 单片机编程语言 3 2.2 控制系统设计 3 2.3 显示方式 3 第三章 系统硬件设计 4 3.1 总体硬件设计 4 3.2 系统各硬件电路介绍 5 3.2.1 电源电路设计介绍 …

蓝牙系列七:开源蓝牙协议栈BTStack数据处理(Wireshark抓包分析)

继续蓝牙系列的研究。 在上篇博客&#xff0c;通过阅读BTStack的源码&#xff0c;大体了解了其框架&#xff0c;对于任何一个BTStack的应用程序都有一个main函数&#xff0c;这个main函数是统一的。这个main函数做了某些初始化之后&#xff0c;最终会调用到应用程序提供的btst…

prometheus 原理(架构,promql表达式,描点原理)

大家好&#xff0c;我是蓝胖子&#xff0c;提到监控指标&#xff0c;不得不说prometheus&#xff0c;今天这篇文章我会对prometheus 的架构设计&#xff0c;promql表达式原理和监控图表的绘图原理进行详细的解释。来让大家对prometheus的理解更加深刻。 架构设计 先来看看&am…

Docker容器化技术(使用Dockerfile制作镜像)

Docker中的镜像分层 Docker 支持通过扩展现有镜像&#xff0c;创建新的镜像。实际上&#xff0c;Docker Hub 中 99% 的镜像都是通过在 base 镜像中安装和配置需要的软件构建出来的。 1、Docker 镜像为什么分层 镜像分层最大的一个好处就是共享资源。 比如说有多个镜像都从相…

python 通过代理服务器 连接 huggingface下载模型,并运行 pipeline

想在Python 代码中运行时下载模型&#xff0c;启动代理服务器客户端后 1. 检查能否科学上网 $ curl -x socks5h://127.0.0.1:1080 https://www.example.com <!doctype html> <html> <head><title>Example Domain</title><meta charset"…

Python: 如何绘制核密度散点图和箱线图?

01 数据样式 这是数据样式&#xff1a; 要求&#xff08;我就懒得再复述一遍了&#xff0c;直接贴图&#xff09;&#xff1a; Note&#xff1a;数据中存在无效值NA&#xff08;包括后续的DEM&#xff09;&#xff0c;需要注意 02 提取DEM 这里我就使用gdal去提取一下DEM列…

./ 相对路径与node程序的启动目录有关

node:internal/fs/sync:78 return binding.openSync( ^ Error: ENOENT: no such file or directory, open D:\前端的学习之路\项目\codeHub\keys\private_key.pem at Object.open (node:internal/fs/sync:78:18) at Object.openSync (node:fs:565:…

Java后台面试相关知识点解析

文章目录 JavaJava中四种引用类型及使用场景集合HashMap源码及扩容策略HashMap死循环问题ConcurrentHashMap与HashtableConCurrentHashMap 1.8 相比 1.7判断单链表是否有环&#xff0c;并且找出环的入口 IO线程池线程池的几种创建方式判断线程是否可以回收线程池的7大核心参数线…

菜鸟学会Linux的方法

系统安装是初学者的门槛&#xff0c;系统安装完毕后&#xff0c; 很多初学者不知道该如何学习&#xff0c;不知道如何快速进阶&#xff0c; 下面作者总结了菜鸟学好Linux技能的大绝招&#xff1a; 初学者完成Linux系统分区及安装之后&#xff0c;需熟练掌握Linux系统管理必备命…

蓝桥省赛倒计时 35 天-bfs 和 dfs

#include <iostream> using namespace std; int t; int m,n; char mp[55][55];//不能写成 int 数组 bool vis[55][55]; int dx[ ]{1,0,-1,0},dy[ ]{0,1,0,-1}; int res;void dfs_1(int x,int y){vis[x][y] true;//陆地向四个方向拓展for(int i0;i<4;i){int nx xdx[i…

蓝桥杯练习系统(算法训练)ALGO-973 唯一的傻子

资源限制 内存限制&#xff1a;256.0MB C/C时间限制&#xff1a;1.0s Java时间限制&#xff1a;3.0s Python时间限制&#xff1a;5.0s 问题描述 腿铮找2255有点事&#xff0c;但2255太丑了&#xff0c;所以腿铮不知道他的长相。正愁不知道到如何找他的时候&#xff0c;…

基于React低代码平台开发:直击最新高效应用构建

&#x1f3e1;浩泽学编程&#xff1a;个人主页 &#x1f525; 推荐专栏&#xff1a;《深入浅出SpringBoot》《java对AI的调用开发》 《RabbitMQ》《Spring》《SpringMVC》《项目实战》 &#x1f6f8;学无止境&#xff0c;不骄不躁&#xff0c;知行合一 文章目录…

2024鸿蒙迎来大爆发,有必要转行鸿蒙开发吗?

鸿蒙开发&#xff0c;这个名字最近在科技圈引起了不小的轰动。 那么&#xff0c;鸿蒙开发到底是什么呢&#xff1f;它又能给我们带来怎样的影响呢&#xff1f; 鸿蒙开发&#xff0c;简单来说&#xff0c;就是基于鸿蒙操作系统的一种应用开发方式。鸿蒙系统&#xff0c;作为华为…