当前位置: 首页 > news >正文

P1379 八数码难题 绿

题意:在3×3的棋盘上,摆有八个棋子,每个棋子上标有1到8的某一数字。棋盘中留有一个空格,空格用0来表示。目标状态为123804765,找到一种最少步骤的移动方法

a*分析:

估价函数:从当前状态到目标状态,就是曼哈顿距离之和

将bfs优化成a*,用优先队列存储序列以及字符串

代码:

#include<bits/stdc++.h>
using namespace std;
unordered_map<string,int>d;
queue<string>q;
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 aStar(string start){string end="123804765";unordered_map<string,int> d;priority_queue<pair<int,string>> q;//大根堆q.push({-f(start),start}); d[start]=0;while(q.size()){auto a=q.top(); q.pop();string s=a.second;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;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<<aStar(s)<<endl;return 0;
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • PlayCanvas的EventHandler.on函数修改了返回值导致链式调用无法进行
  • 工 厂设计模式
  • 深度学习 vector 之模拟实现 vector (C++)
  • 无人机电子调速器详解!!!
  • 杀完进程,自动重启怎么办
  • Excel中的“块”操作
  • Python的基本数据类型
  • Kali Linux 命令大全
  • goweb框架-gin
  • 计算机Java项目|基于SpringBoot的实习管理系统的设计与实现
  • 计算机毕业设计 公寓出租系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试
  • 打破接口壁垒:适配器模式让系统无缝对接
  • pytorch实现模型搭建
  • 如何利用chatgpt写文章,修改论文?
  • 【微信小程序】自定义组件 - 父子组件之间的通信
  • 002-读书笔记-JavaScript高级程序设计 在HTML中使用JavaScript
  • CentOS6 编译安装 redis-3.2.3
  • JS题目及答案整理
  • Laravel Mix运行时关于es2015报错解决方案
  • MySQL QA
  • SegmentFault 2015 Top Rank
  • socket.io+express实现聊天室的思考(三)
  • TypeScript实现数据结构(一)栈,队列,链表
  • use Google search engine
  • vue数据传递--我有特殊的实现技巧
  • 从地狱到天堂,Node 回调向 async/await 转变
  • 规范化安全开发 KOA 手脚架
  • 如何使用 JavaScript 解析 URL
  • 数据仓库的几种建模方法
  • 责任链模式的两种实现
  • 国内开源镜像站点
  • ​Linux Ubuntu环境下使用docker构建spark运行环境(超级详细)
  • # 数论-逆元
  • $(document).ready(function(){}), $().ready(function(){})和$(function(){})三者区别
  • (¥1011)-(一千零一拾一元整)输出
  • (1综述)从零开始的嵌入式图像图像处理(PI+QT+OpenCV)实战演练
  • (22)C#传智:复习,多态虚方法抽象类接口,静态类,String与StringBuilder,集合泛型List与Dictionary,文件类,结构与类的区别
  • (Java)【深基9.例1】选举学生会
  • (PHP)设置修改 Apache 文件根目录 (Document Root)(转帖)
  • (备忘)Java Map 遍历
  • (附源码)spring boot校园拼车微信小程序 毕业设计 091617
  • (附源码)计算机毕业设计ssm高校《大学语文》课程作业在线管理系统
  • (五)IO流之ByteArrayInput/OutputStream
  • ****Linux下Mysql的安装和配置
  • .bat批处理(二):%0 %1——给批处理脚本传递参数
  • .Mobi域名介绍
  • .NET Core 控制台程序读 appsettings.json 、注依赖、配日志、设 IOptions
  • .net后端程序发布到nignx上,通过nginx访问
  • .NET开发者必备的11款免费工具
  • .NET使用存储过程实现对数据库的增删改查
  • .NET委托:一个关于C#的睡前故事
  • [.NET 即时通信SignalR] 认识SignalR (一)
  • []常用AT命令解释()
  • [Android Pro] listView和GridView的item设置的高度和宽度不起作用
  • [Android View] 可绘制形状 (Shape Xml)