15Puzzle 强行A*求解 C++

UVA - 10181 15-Puzzle Problem(15数码 A*) 题目大意: 给你一个八数码的序列,要求你在50步之内还原成,初始的形状,如果可以就输出其路径,否则就输出 This puzzle is not solvable. 解析: 这题是用A*算法实现的,上网查了很多资料,了解了什么是A*算法。 A*算法,实质上是根据估价函数进行bfs,每次都选取估价最小的状态,进行移动。 其中 f(n) 是从初始点经由节点n到目标点的估价函数, g( 阅读详情

对于当前状态(f,p)做了启发函数,由U=depth*factor1+getU(f,p)*factor2;得出节点的U,始终先搜索U较小的情况

虽说老老实实 U=depth+HL(f,p) (HL为曼哈顿距离+线性冲突*2) 可以理论上比较容易地证明得出最优解,而且也能对付一些比较简单的情况,然而我并没有这么做, 在一系列疯狂凑参数+瞎几把优化后,竟然得出了非常实用的伪劣A*解

factor根据需求可调整为
21:11(求最优解,在70步内未发现反例,建议使用) ,但一些70步以上的case可以说是GG了,在luogu上我发了个个人题,放了7个随机中前30%难(按我的代码运行时间排)的case,和1个偶然找到的虽然只有55步,但可以让基于哈密顿距离的启发函数表现很差的case, 还有1个70步case (基本上由随机+向步数增加方向移动是到不了70步的),表现是(用21:11), 7.52ms/181.45MB, 耗时最长为55步的case 2.6s.
2:1 且修改fmp为0,2,4,6,2,4,6,8…, (严格求最优解,效率感人)
17:10 (求大部分情况的最优解,对于有较小可能性多2步)
3:2 (很快速求解,目前没发现超过600ms的情况,可能会多2-6步)

目前我的方式是 21:11达到限制后转 17:10
对于15 14 9 13 11 10 0 12 7 6 5 8 3 1 2 4, 17:10的结果是75,不知道对不对。

也可以在hashset done 中加上步数信息以回溯得知具体解。

也许你会想:A*的内存不会炸?
那我只能表示,用int64存一个状态足矣

还有,启发函数用啥?
玄学魔改哈密顿距离+伪劣版线性冲突你值得拥有

下面是15Puzzle模拟器并加上了求解功能:
可在Windows或C4droid 由GCC编译 (C++11 以上)

操作: WSAD/2468移动,0/r随机打乱,1/h求解(只有长度),3/i开启输入

#define WINDOWS
#ifdef WINDOWS
#include <windows.h>
#endif
#include <cstdio>
#include <cstdlib>
#include <ctime>
#include <conio.h>
#include <unordered_set>
#include <queue>
#include <functional>

/*
   3 11 6 0 2 1 9 8 4 7 14 5 15 10 12 13  55
   15 14 9 13 11 10 0 12 7 6 5 8 3 1 2 4  75??
*/
   
using namespace std;

typedef unsigned long long U64;

const U64* base=[]() {
   
   
	U64 *b=new U64[16] {
   
   15};
	for(int i=1; i<16; ++i) {
   
   
		b[i]=(b[i-1]<<4);
	}
	return b;
}();

const U64 *rbase=[]() {
   
   
	U64 *rb=new U64[16];
	for(int i=0; i<16; ++i) rb[i]=~base[i];
	return rb;
}();

U64 ac=0xfedcba9876543210llu;
const char U_=0,D_=1,L_=2,R_=3,RANDF=17,NEXTI=18,IMPORT=19,ILLACT=-1;

#define REV(DR) ((DR)^1)

#define U_ABLE(P) ((P)&12)
#define U_P(P) ((P)-4)
#define D_ABLE(P) ((P)<12)
#define D_P(P) ((P)+4)
#define L_ABLE(P) ((P&3))
#define L_P(P) ((P)-1)
#define R_ABLE(P) (~(P)&3)
#define R_P(P) ((P)+1)

#define up(F,P) ((rbase[P]|(F<<16))&F|base[P-4])
#define down(F,P) ((rbase[P]|(F>>16))&F|base[P+4])
#define left(F,P) ((rbase[P]|(F<<4))&F|base[P-1])
#define right(F,P) ((rbase[P]|(F>>4))&F|base[P+1])

const int fmp[4][4]= {
   
   {
   
   0,2,4,7},
	{
   
   2,4,6,10},
	{
   
   4,6,9,12},
	{
   
   7,10,12,15}
};

int factor1=21,factor2=11;
int next_factor1=17, next_factor2=10;
const size_t MAXSIZE=20000000;


void output(U64 o) {
   
   
	for(int i=0; i<4; ++i) {
   
   
		for(int j=0; j<4; 
Qt实现数字华容道大作业:从逆序数可解性到界面信号槽全解析 数字华容道是经典的搜索与状态空间问题,也是C++课程设计中融合算法与图形界面的典型项目。实现过程中,除了常用的BFS最短路径或IDA*启发式搜索,还需处理随机打乱后的可解性判定——逆序数奇偶性是核心数学原理。一个可玩的游戏关键在于状态表示与移动逻辑,而基于Qt Widgets的界面开发则涉及paintEvent绘制、坐标换算与信号槽交互,这些技术共同构成了桌面应用工程的完整链路。从控制台验证到图形化展示,再到编译部署与答辩自测,掌握数据结构设计、界面事件响应与工程避坑方法,能显著提升开发效率。本文以4×4数 阅读详情

相关推荐

15-puzzle:解决15题(15局游戏)

15拼图 我们实现了三种搜索算法以从随机的起始位置查找解决方案: 贪婪:从经验上讲最快,但是解决方案可能很长。 Dijkstra算法:保证最短路径,但需要大量资源。 A *搜索:比Dijkstra更快,比贪婪更好。

15puzzle:15puzzle 游戏的求解器

自述文件 这个存储库是做什么用的? 求解 15 个谜题。 使用 A* 算法。

15谜(15-puzzle)问题的求解

应用了人工智能中非常经典的A*算法解决了同样很经典的15谜问题,该算法比深度和广度优先算法都快了很多

15-Puzzle:15-Puzzle 游戏的 C++ 实现。 亮点 A* 搜索算法

概述 是一种游戏,它由一帧随机排列的编号方块组成,其中缺少一个方块。 目标是重新排列块,使它们有序,使用尽可能少的移动。 执行 它被实现为最佳优先搜索。 该问题的解决方案说明了一种称为的通用人工智能方法。 游戏的SEACH节点由板的组合来表示,的移动次数作出到达板和前一搜索节点。 首先,将初始搜索节点(初始板)插入到优先队列中。 然后,从优先级队列中删除具有最小优先级的搜索节点,并插入其所有相邻的搜索节点。 重复此过程,直到目标板从优先级队列中出队。 这种方法的成功取决于搜索节点的优先级函数的选择。 我们考虑两个优先级函数: 汉明优先功能。 错误位置的块数,加上到目前为止到达搜索节点的移动次数。 曼哈顿优先函数。 从块到其目标位置的曼哈顿距离的总和(垂直和水平距离的总和),加上到目前为止到达搜索节点的移动次数。 发展 创建一个构建目录,假设您在此存储库的根目录中创建它(不推荐,顺便说一

Rocky Linux 9.0国内yum源一键替换指南(上海交大镜像站实测)

本文详细介绍了如何将Rocky Linux 9.0的yum源替换为上海交大镜像站,以解决国内用户访问官方源速度慢的问题。通过实测验证,上海交大镜像站提供高速下载和稳定更新,并提供了完整的替换步骤、常见问题解决方案及高级优化配置,帮助用户提升软件包下载效率。

weixin_29304985的博客 359

Unity序列帧动画输出全攻略:Recorder+Timeline实战与透明通道处理

序列帧动画是游戏开发、影视动画和UI动效中的基础技术,指将连续动作分解为一系列静态图像并按序播放,形成动态视觉效果。其原理是通过时间轴精确控制每一帧的内容与时机,实现动画的逐帧呈现。在实时渲染领域,序列帧输出技术价值显著,它能够将动态内容高质量地转换为静态图像序列,便于跨平台复用、后期合成与资源分发。应用场景广泛,包括角色动画导出、技能特效制作、宣传片素材生成等。本文聚焦Unity引擎,深入解析如何利用Recorder与Timeline工具链,高效输出带Alpha透明通道的PNG序列帧,并重点攻克透明通道处

weixin_31556767的博客 327

COMSOL后处理与可视化

公众号→【COMSOL仿真交流】←更多精彩内容 后处理是采用COMSOL建模的一个重要环节。通过软件自带的可视化工具,可以快速方便的展现仿真结果。 COMSOL为使用者提供了多种后处理工具,包括表面图、切面图、等值线图、流线图、线图、体图等等。可按功能分为数据集(储存数据的地方)、派生值和表单(对数据进行进一步的操作)、绘图组合绘图类型(显示数据结果的地方)、导出数据与生成报告。   如果想用origin、matlab对模拟数据做进一步的处理,导出excel格式的模拟结果,这可以通过“导出

midiio的博客 4027

别再只调PID了!手把手教你从LC谐振到检波,搞定STM32智能车电磁循迹硬件电路

本文深入解析STM32智能车电磁循迹硬件电路设计,从LC谐振选频到数字信号处理,提供完整的信号链路设计要点与实战技巧。通过优化电磁杆布局和信号放大电路,显著提升赛道位置检测精度,误差可控制在±0.5cm以内,为智能车竞赛提供可靠硬件支持。

weixin_29220405的博客 263

飞凌OK3588-C Linux R4系统下MIPI YUV摄像头CSI尺寸错误排查与极性适配方案

本文详细介绍了在飞凌OK3588-C平台的Linux R4系统下调试MIPI YUV摄像头时遇到的'csi size err'错误排查与极性适配方案。通过分析信号极性、驱动参数调整及FPGA协同调试,提供了从硬件检测到系统级调试的完整解决方案,帮助开发者快速解决类似问题。

bean的博客 258

一.镜头知识之焦点,焦距,有效焦距,前焦距,后焦距

由光学系统中镜片的最后一面到像面的距离。

AIoT深度探索者 | 嵌入式系统架构师 深耕物联网(IoT)与人工智能(AI)融合技术,聚焦​​边缘计算、图像开发、低功耗通信协议​​,致力于智能硬件,关注我获取最新技术文章信息与海量资源~ 5576

Autosar MCAL-S32k324 Crypto配置-基于EB

NXP官网提供了免费的HSE固件,同时也提供了对应的协议栈。本文以算法为例,介绍MCAL相关的配置及在代码中的集成与使用。使用HSE计算,比软件算法确实方便许多。后面会完善更多的算法测试。

赞的博客 2434

vscode 配置 codeql

vscode 配置 codeql

SHELLCODE_8BIT的博客 1439

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

上一篇: Leetcode 611. Valid Triangle Number O(nlogn) NTT
StarInShadow
博客等级 码龄7年 0粉丝 3原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值