luoguP1379 八数码难题[启发式搜索]
题目描述
在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字。棋盘中留有一个空格,空格用0来表示。空格周围的棋子可以移到空格中。要求解的问题是:给出一种初始布局(初始状态)和目标布局(为了使题目简单,设目标状态为123804765),找到一种最少步骤的移动方法,实现从初始布局到目标布局的转变。
输入输出格式
输入格式:
输入初试状态,一行九个数字,空格用0表示
输出格式:
只有一行,该行只有一个数字,表示从初始状态到目标状态需要的最少移动次数(测试数据中无特殊无法到达目标状态数据)
输入输出样例
283104765
4
#include<cstdio>
#include<cstring>
#include<iostream>
#include<cmath>
using namespace std; //目标态
int fin[][]={{,},{,},{,},{,},{,},{,},{,},{,},{,}}; struct State{
int a[][];
}; int lim=,ok; //计算f(n)函数
int H(const State &st){
int ret=;
for(int i=;i<;i++)
for(int j=;j<;j++){
int t=st.a[i][j];
if(t) ret+=abs(fin[t][]-i)+abs(fin[t][]-j);
}
return ret;
} void dfs(State st,int g){
int h=H(st);
if(ok||g+h>lim)
return;
if(!h){
ok=;
return;
}
int x,y;
for(int i=;i<;i++)
for(int j=;j<;j++)
if(!st.a[i][j]){
x=i,y=j;
break;
}
if(x>){
swap(st.a[x][y],st.a[x-][y]);
dfs(st,g+);
swap(st.a[x][y],st.a[x-][y]);
}
if(x<){
swap(st.a[x][y],st.a[x+][y]);
dfs(st,g+);
swap(st.a[x][y],st.a[x+][y]);
}
if(y>){
swap(st.a[x][y],st.a[x][y-]);
dfs(st,g+);
swap(st.a[x][y],st.a[x][y-]);
}
if(y<){
swap(st.a[x][y],st.a[x][y+]);
dfs(st,g+);
swap(st.a[x][y],st.a[x][y+]);
}
} int main(){
State st;
char ch[];
scanf("%s",ch);
for(int i=;i<;i++)
for(int j=;j<;j++)
st.a[i][j]=ch[i*+j]-'';
while(++lim){
dfs(st,);
if(ok) break;
}
printf("%d\n",lim);
return ;
}
在写盲目bfs 1590ms 后很久才用的IDA*解法
感谢will7101在luogu上题解给本蒟蒻此题IDA*稍短代码的启蒙
终于学会了计算h(n) QwQ
luoguP1379 八数码难题[启发式搜索]的更多相关文章
- 「LuoguP1379」 八数码难题(迭代加深
[P1379]八数码难题 - 洛谷 题目描述 在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格,空格用0来表示.空格周围的棋子可以移到空格中.要求解的问题是:给出一种 ...
- 双向广搜+hash+康托展开 codevs 1225 八数码难题
codevs 1225 八数码难题 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description Yours和zero在研究A*启 ...
- Codevs 1225 八数码难题
1225 八数码难题 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description Yours和zero在研究A*启发式算法.拿到一道经典的 ...
- 【洛谷P1379】八数码难题(广搜、A*)
八数码难题 题目描述 一.广搜: 首先要考虑用什么存每一个状态 显然每个状态都用一个矩阵存是很麻烦的. 我们可以考虑将一个3*3的矩阵用一个字符串或long long 存. 每次扩展时再转化为矩阵. ...
- [luogu]P1379 八数码难题[广度优先搜索]
八数码难题 ——!x^n+y^n=z^n 我在此只说明此题的一种用BFS的方法,因为本人也是初学,勉勉强强写了一个单向的BFS,据说最快的是IDA*(然而蒟蒻我不会…) 各位如果想用IDA*的可以看看 ...
- 洛谷P1379八数码难题
题目描述 在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格,空格用0来表示.空格周围的棋子可以移到空格中. 要求解的问题是:给出一种初始布局(初始状态)和目标布局(为 ...
- 洛谷 P1379 八数码难题 解题报告
P1379 八数码难题 题目描述 在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格,空格用0来表示.空格周围的棋子可以移到空格中.要求解的问题是:给出一种初始布局(初 ...
- 习题:八数码难题(双向BFS)
八数码难题(wikioi1225) [题目描述] 在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格,空格用0来表示.空格周围的棋子可以移到空格中.要求解的问题是:给出 ...
- 洛谷——P1379 八数码难题
P1379 八数码难题 双向BFS 原来双向BFS是这样的:终止状态与起始状态同时入队,进行搜索,只不过状态标记不一样而已,本题状态使用map来存储 #include<iostream> ...
随机推荐
- Selenium基础知识
本人博客文章网址:https://www.peretang.com/basic-knowledge-of-selenium/ 什么是Selenium Selenium是一个自动化测试工具 是一组不同的 ...
- day_ha配置文件
流程图: 代码 #!/sur/bin/env python # -*- coding: utf-8 -*- #{"backend": "www.oldboy.org&qu ...
- 学习笔记TF022:产品环境模型部署、Docker镜像、Bazel工作区、导出模型、服务器、客户端
产品环境模型部署,创建简单Web APP,用户上传图像,运行Inception模型,实现图像自动分类. 搭建TensorFlow服务开发环境.安装Docker,https://docs.docker. ...
- cef3和duilib简单仿有道词典学习
由于最近换工作的原因,也没啥事,就简单学习了一下cef3和duilib,楼主之前是做MFC框架下的windows开发的,对界面库和新的客户端开发模式也有所了解,现在的大部分客户端都是基本的客户端框架下 ...
- eclipse tomcat add时提示The Tomcat server configuration at \Servers\Tomcat v6.0 Server at localhost-
原因为左侧项目中把对于网络应用的servers项目给关闭或删除了,导致相应的localhost-config无法定位,所以才发生的错误. 解决办法:删除servers下的tomcat 重新添加serv ...
- Flash TextField selectable bug block TextEvent.Link solution
There is an old version Felx SDK bug(in my case it's Flex SDK v3.3.0.4852) that when TextField.selec ...
- Spring Boot 构建 WAR和JAR 文件
原文:https://github.com/x113773/testall/issues/3 ## JAR文件方式一:1. 修改[pom.xml](https://github.com/x113773 ...
- 【Android Developers Training】 95. 创建一个同步适配器
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
- 【Android Developers Training】 15. 启动一个Activity
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
- JAX-RS REST 服务结果的自动封装
如转发请注明: 原文luyiisme博客 当使用遵循 JAX-RS 标准的框架开发REST 服务时,我们倾向于定义个(含有JAX-RS)注解接口. 服务器端负责实现该接口,而客户端是该接口的代理进行远 ...