P1379 八数码难题

题目描述

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

输入格式

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

输出格式

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

输入输出样例

输入 #1复制

283104765

输出 #1复制

4

说明/提示

样例解释

图中标有 0 的是空格。绿色格子是空格所在位置,橙色格子是下一步可以移动到空格的位置。如图所示,用四步可以达到目标状态。

并且可以证明,不存在更优的策略。

解析:

1.最短步骤想到使用bfs,用string来记录当前的状态,遍历状态。

注意:string 下角标是从0开始的,x = dx/3 , y = dy%3; 为真实九宫格的坐标。九宫格坐标是从(0,0)开始的。

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<unordered_map>
using namespace std;
unordered_map<string,int> d;
queue<string> q;
int dx[4] ={-1,0,1,0};
int dy[4] = {0,1,0,-1};int bfs(string str)
{q.push(str);string end="123804765";while(q.size()){string s = q.front();q.pop();if(s==end) return d[s];int k = s.find('0');int x = k/3,y = k%3;for(int i = 0;i < 4;i++){int a = x+dx[i],b = y + dy[i];if(a<0||a>=3||b<0||b>=3) continue;int dis = d[s];swap(s[k],s[a*3 + b]);if(!d.count(s))//交换 d[s] = dis+1,q.push(s);swap(s[k],s[a*3+b]);//还原			}}	
} 
int main()
{string s;cin >> s;cout << bfs(s)<<endl;	return 0;
}

时间复杂度为:O(9^{2})

使用A*算法进行优化。

A算法给出了评价函数的定义: f(n) = g(n) + h(n)
其中,n为待评价的节点;g(n)为从初始节点s到节点n的最佳路径耗散值的估计值;h(n)为从节点n到目标节点t的最佳路径耗散值的估计值,称为启发函数;f(n)为从初始节点s经过节点n到达目标节点的最佳路径耗散值的估计值,成为评价函数,我们每次从叶节点选出f(n)最小的节点扩展。
 

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<unordered_map>
#include<bits/stdc++.h>
using namespace std;
unordered_map<string,int> d;
string goal = "123804765";
int gx[] = {-1,0,0,0,1,2,2,2,1};
int gy[] = {-1,0,1,2,2,2,1,0,0};
int dx[4] ={-1,0,1,0};
int dy[4] = {0,1,0,-1};
int f(string s)
{ // 每个数字到目的地的坐标 int res = 0;for(int i = 0;i < 9;i++){int t = s[i]-'0';if(t) res+= abs(i/3 - gx[t]) + abs(i%3-gy[t]);}return res;
}
int bfs(string str)
{unordered_map<string,int> d;priority_queue<pair<int,string>> q;//默认大根堆 ,我们只需要取负数,小的数就会在上面 q.push({-f(str),str});d[str] = 0;while(q.size()){auto a = q.top();q.pop();string s = a.second;if(s== goal) return d[s]; // d 记录现实的 状态 f为理想状态下 曼哈顿距离 int k = s.find('0');int x = k /3,y = k%3;for(int i = 0;i < 4;i++){int a = x+dx[i],b = y + dy[i];if(a<0|| a>=3||b<0|| b>=3) continue;string t = s;swap(t[k],t[a*3+b]);if(!d.count(t)){d[t] = d[s]+1,q.push({-(d[t] + f(t)),t});}}}
} 
int main()
{string s;cin >> s;cout << bfs(s)<<endl;	return 0;
}

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

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

相关文章

哪里能找到好用的PPT模板?12个免费模板网站让你畅快办公!

你是否有过这样的经历&#xff0c;在准备重要会议或者演讲的时候&#xff0c;为找不到合适的PPT模板而困扰&#xff1f;或是在网上漫无目的地搜寻&#xff0c;结果收获的是设计平淡无奇的PPT模板&#xff1f; 如果你有同样的疑问&#xff0c;那么你来对地方了&#xff01;在这…

电脑扩容升级硬盘选1T还是2T

SSD固态有必要升级2TB吗&#xff1f;----------吴中函 某大二学生用的一台笔记本电脑&#xff0c;512GB的硬盘空间已经严重不够用了&#xff0c;想给笔记本扩容升级一下硬盘&#xff1b; 这位学生是学设计专业的、平时也喜欢摄影、电脑里面也装了一些游戏&#xff0c;经常整理、…

Linux技术,winSCP连接服务器超时故障解决方案

知识改变命运&#xff0c;技术就是要分享&#xff0c;有问题随时联系&#xff0c;免费答疑&#xff0c;欢迎联系&#xff01; 故障现象 使用 sftp 协议连接主机时, 明显感觉缓慢且卡顿,并且时常出现如下报错: 点击重新连接后,又有概率重新连接上; 总之在"连接上"和&…

【Web】NSSCTF Round#16 Basic个人wp(全)

出题友好&#xff0c;适合手生复健。 目录 ①RCE但是没有完全RCE ②了解过PHP特性吗 ①RCE但是没有完全RCE 上来就是一段md5八股 (string)就是不让用数组了&#xff0c;然后强比较需要md5碰撞 ?md5_1%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc…

josef约瑟 中间继电器 HJDZ-E440额定电压:AC220V 卡轨安装

HJDZ-静态中间继电器 系列型号&#xff1a; HJDZ-A200静态中间继电器&#xff1b;HJDZ-A110静态中间继电器&#xff1b; HJDZ-A002静态中间继电器&#xff1b;HJDZ-A004静态中间继电器&#xff1b; HJDZ-E112静态中间继电器&#xff1b;HJDZ-E112L静态中间继电器&#xff1…

计算机网络——应用层(3)

计算机网络——应用层&#xff08;3&#xff09; 小程一言专栏链接: [link](http://t.csdnimg.cn/ZUTXU) 点对点&#xff08;P2P&#xff09;P2P网络一般用途优点缺点总结 套接字编程基本步骤UDP套接字TCP套接字基本步骤 二者对比 小程一言 我的计算机网络专栏&#xff0c;是自…

开放式耳机和骨传导耳机有什么区别?谁更值得入手?

很多人都知道开放式耳机&#xff0c;但很少有人知道其实骨传导耳机也算开放式耳机的一种&#xff0c;事实上&#xff0c;开放式耳机可以分为气传导耳机和骨传导耳机两种类型&#xff0c;这两种耳机佩戴方式都是开放双耳机&#xff0c;但传声方式有所不同&#xff0c;下面简单科…

《C语言学习》---郝斌版---笔记

简介 学习计算机&#xff0c;离不开C语言的学习&#xff0c;而C语言学习过程中的视频课教程&#xff0c;目前来说&#xff0c;如果郝斌老师的C语言排第二&#xff0c;没有人敢排第一 郝斌老师的C语言教程&#xff0c;通俗易懂&#xff0c;引人发思&#xff0c;特别适合新手入门…

如何定义核心场景用例?

首先我们解决两个问题&#xff1a; 1.什么是场景测试&#xff1f;2.什么是核心场景&#xff1f; 1、什么是场景测试&#xff1f; &#x1f3af; 1.1&#xff1a;什么是场景 事件触发时的情景形成了场景。场景必不可少的几个要素&#xff1a;环境、人、时间、行为。简而言之&…

Rust-变量

Rust的变量必须先声明后使用。对于局部变量&#xff0c;最常见的声明语法为&#xff1a; let variable:i32 100;与传统的C/C语言相比&#xff0c;Rust的变量声明语法不同。这样设计主要有以下几个方面的考虑。 语法分析更容易 从语法分析的角度来说&#xff0c;Rust的变量声明…

Linux系统编程(十一):高级 IO

参考引用 UNIX 环境高级编程 (第3版)嵌入式Linux C应用编程-正点原子 1. 非阻塞 I/O 阻塞就是进入了休眠状态&#xff0c;交出了 CPU 控制权阻塞 I/O 就是对文件的 I/O 操作&#xff08;读写操作&#xff09;是阻塞式的&#xff0c;非阻塞 I/O 就是对文件的 I/O 操作是非阻塞的…

网络技术基础入门全套实验-厦门微思网络CCNA实验手册

知识改变命运&#xff0c;技术就是要分享&#xff0c;有问题随时联系&#xff0c;免费答疑&#xff0c;欢迎联系&#xff01; 微思简介&#xff08;https://www.xmws.cn) 微思成立于2002年&#xff0c;是一个诚信敬业、积极向上、充满活力、专注技术服务的企业。 微思获得了八…

电子学会2023年12月青少年软件编程(图形化)等级考试试卷(四级)真题,含答案解析

青少年软件编程(图形化)等级考试试卷(四级) 分数:100 题数:24 一、单选题(共10题,共30分) 1. 运行下列程序,输入“abcdef”,程序结束后,变量“字符串”是?( )

Linux--部署 Tomcat 及其负载均衡

1.案例前置知识点 1&#xff09;Tomcat简介 名称由来&#xff1a;Tomcat最初是由 Sun的软件构架师詹姆斯邓肯戴维森开发的。后来他帮助将其变 为开源项目&#xff0c;并由Sun贡献给Apache软件基金会。由于大部分开源项目OReilly都会出一本相关的 书&#xff0c;并且将其封面设…

SpringMVC视图

文章目录 1、ThymeleafView2、转发视图3、重定向视图4、视图控制器view-controller5、总结 SpringMVC中的视图是View接口&#xff0c;视图的作用渲染数据&#xff0c;将模型Model中的数据展示给用户SpringMVC视图的种类很多&#xff0c;默认有转发视图和重定向视图当工程引入js…

2024几个测试接口的好工具,效率加倍~

作为一名后端程序员&#xff0c;一定要对自己写的接口负责&#xff0c;保证接口的正确和稳定性。因此&#xff0c;接口测试也是后端开发中的关键环节。 但我相信&#xff0c;很多朋友是懒得测试接口的&#xff0c;觉得这很麻烦。一般自己写的接口自己都不调用&#xff0c;而是…

在Linux上搭建Maven仓库

目录 一、下载安装包二、安装maven三、修改配置文件settings.xml四、配置环境变量五、测试maven是否可用 一、下载安装包 我在这里为大家准备好了apache-maven-3.5.0-bin.tar.gz&#xff0c;百度网盘下载链接如下&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1bGun…

NodeJs 第十一章 express

Express 是基于 Node.js 平台&#xff0c;快速、开放、极简的 web 开发框架 基本使用 安装 npm install express --save示例代码 const express require(express) const app express() const port 3000app.get(/, (req, res) > {res.send(Hello World!) })app.listen(…

NSR原理描述

相关概念 HA&#xff08;High Availability&#xff09;&#xff1a;高可靠性/高实用性的简称&#xff0c;这里指主备板间的备份通道。NSF&#xff08;Non-Stop Forwarding&#xff09;&#xff1a;不间断转发。NSR&#xff08;Non-Stop Routing&#xff09;&#xff1a;不间断…

24年春招要来了,大学生第一次实习去大厂重要么?

春招要来了&#xff0c;大学生第一次实习去大厂重要么? 1.错峰实习。2.继任直招。3.优化简历&#xff0c;匹配优先。4. 善用新技术 先说一个暴论: 实习一定要去大厂&#xff0c;尤其是非头部院校的同学&#xff0c;你就算进去打螺丝&#xff0c;也要进大厂 关于我&#xff1a…