poj2286 唯美的IDA*(80行)

POJ1077(经典的八数码问题) 很经典的八数码问题,可以用单向广度优先搜索、双向广度优先搜索、A*算法、IDA算法解。 用了双向广度优先搜索和A*算法解,在用A*算法时,纠结了好几天,后来在网上看了一份博客才发现自己错在哪。之后解出来了。虽然做这题时很纠结,不过收获真的很大,痛而快乐着………… 下面贴出用双向广度优先搜索和A*算法做的代码   //A*算法 #include #include #include 阅读详情

ida*果然比a*强太多了,少了hash判重和堆维护,是估价函数和DFS的完美结合啊!

嗯,主要是DFS函数中第二行的那个强剪枝太给力了!IDA*的灵魂啊!

基本的架构就是如此了,可以任意套。

//poj2286
#include <iostream>
#include <cmath>
using namespace std;
const int b[5][8] = { 7,8,9,12,13,16,17,18,
                      1,3,7,12,16,21,23,0,
                      2,4,9,13,18,22,24,0,
                      11,10,9,8,7,6,5,0,
                      20,19,18,17,16,15,14,0};
const int c[9] = {0,1,2,3,4,6,5,8,7};
int a[25],stk[1010],bound,x,final;
bool ans;
int h(int *a) {
    int tmp[3]={0,0,0};
    for (int i=0;i<8;i++)
        tmp[a[b[0][i]]-1]++;
    return 8-max(max(tmp[0],tmp[1]),tmp[2]);
}
void trans(int *a,int p) {
     if (p<=4) {
               int tmp = a[b[p][0]];
               for (int i=0;i<6;i++)
                   a[b[p][i]]=a[b[p][i+1]];
               a[b[p][6]]=tmp;
     } else {
               p-=4;
               int tmp = a[b[p][6]];
               for (int i=6;i>0;i--)
                   a[b[p][i]]=a[b[p][i-1]];
               a[b[p][0]]=tmp;
     }
}
int dfs(int *a,int dep,int pre_move) {
    int hv = h(a);
    if (hv + dep > bound) return hv+dep;
    if (hv==0) {
               ans = true;
               final = a[7];
               return dep;
    }
    int next_bound = 10000;
    for (int i=1;i<=8;i++) {
        if (abs(c[i]-pre_move)==4) continue;   //与上一步相反的移动
        int tmp[25];
        for (int j=1;j<=24;j++) tmp[j]=a[j];
        trans(tmp,c[i]);
        stk[dep]=i;
        int new_bound = dfs(tmp,dep+1,c[i]);
        if (ans) return new_bound;
        next_bound = min(next_bound,new_bound);
    }
    return next_bound;
}
void ida_star() {
     memset(stk,0,sizeof(stk));
     bound = h(a);
     ans = false;
     while (!ans && bound<=100)
           bound = dfs(a,0,-100);
     for (int i=0;i<bound;i++) printf("%c",stk[i]+64);
     printf("\n%d\n",final);
}
int main() {
    while (~scanf("%d",&x)) {
          if (x==0) break;
          a[1]=x;
          for (int i=2;i<=24;i++)
              scanf("%d",&a[i]);
                  
          if (h(a)==0) {
                    printf("No moves needed\n");
                    printf("%d\n",a[7]);
                    continue;
          }
          ida_star();
    }
    return 0;
}


POJ2286的代码 The rotation game uses a # shaped board, which can hold 24 pieces of square blocks (see Fig.1). The blocks are marked with symbols 1, 2 and 3, with exactly 8 pieces of each kind. 立即下载

相关推荐

POJ 1077 算法

关于C++ 算法 北大网站POJ 八数码问题

POJ1077八数码

POJ1077:八数码问题(Eight) POJ1077查看 文章目录POJ1077:八数码问题(Eight)@[toc]**解题思路**基础知识铺垫广度优先搜索BFS+康托展开广度优先搜索BFS+set二分查找双向广搜DBFS+set二分查找启发式算法+堆+普通标记数组更多策略 解题思路 求步数最少的解时候用广搜 状态的表示问题 若以字符串的形式表示,需要10字节,且检查是否达到目标状...

loveSiri的博客 1310

Unreal 5 MetaHuman插件全流程:从安装到角色动画生成

本文详细介绍了Unreal 5中MetaHuman插件的全流程使用指南,从安装配置到角色动画生成。通过Quixel Bridge下载预设角色,利用面部捕捉技术赋予数字人模型生命力,并提供材质编辑、性能优化等进阶技巧,帮助用户快速创建照片级真实的虚拟角色。

weixin_29009081的博客 829

poj 1077 Eight

题目: 是一道经典的八数码问题。将一个3×3的矩阵,通过每次和四周的数字进行互换,最终达到目标状态。其中用字母“l”表示相左移动,“u”表示向上,“r”表示向右,“d”表示向下,最后结果,输出移动的字母。 样例: 目标位置是 初始位置是: 为了从初始位置到达目标位置,需要先将x与5换位置,再与6换位置,也就是先...

zjsru_Beginner的博客 574

别再只调颜色阈值了!优化K210色块追踪性能的5个关键参数与实战技巧

本文深入探讨了K210色块追踪性能优化的五大核心策略,包括图像预处理参数精细调控、find_blobs参数进阶配置、运动控制算法升级、硬件时序优化以及可视化调试系统构建。通过实战技巧和参数调整方法,帮助开发者提升K210在色块追踪项目中的识别稳定性和响应速度,适用于云台追踪等应用场景。

weixin_42531588的博客 225

EM算法求解混合伯努利模型

本文记录了EM算法求解混合伯努利分布的推导,并提供了matlab实验代码。

霁月难逢 彩云易散 6969

POJ-2286 The Rotation Game + Python(DFS)

题目链接:poj 2286 The Rotation Game-面试哥 题目目的:通过沿8个方向旋转,使得中间8个元素的数值相同,示例如下: 一解题说明 #1 注意事项:Rotation时,需要重新赋值矩阵数据,否则将前后一起变化。 #2 注意事项:用队列存储操作过程,在将队列赋值给新队列时,需要特别注意队列中的元素顺序,因为它对应着操作顺序。 new_step = [] new_step.append(dir_i) ...

xxdragon126的博客 500

SpringBoot一次请求中缓存数据,请求结束就清除的4种方法,你会几种?

通过以上四种方法,你可以在 SpringBoot 的一次请求中缓存数据,并在请求结束后自动清除这些缓存数据。使用 ThreadLocal:适用于需要跨多个方法调用的缓存数据,灵活性高,但需要注意内存泄漏问题。使用 AOP:适用于全局性的缓存管理,代码更加优雅,但需要对 AOP 有一定的了解。使用 ServletRequestListener:适用于简单的请求生命周期管理,配置简单,但功能相对有限。使用 HttpServletRequest 的 setAttribute 和 getAttribute。

java专栏 1295

POJ 1077 八数码 三种解法

POJ 1077 Eight题目链接:http://poj.org/problem?id=1077

lvxin1204的博客 5398

1. SAP Business Application Studio 里创建一个基于 CAP 模型的最简单的 OData 服务

本文基于 SAP Cloud Application Programming 编程模型的 OData 服务开发教程的第一步,简述了 SAP Business Technology Platform 里 Business Application Studio 开发工具的打开方式,创建 Dev Space 以及 CAP 项目的创建步骤,以及如何通过 schema.cds 和 service.cds 分别创建 OData 模型和 OData 服务,最后通过 ports preview 打开 OData 服务预览页

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1797

MTK平台Wi-Fi学习--wifi channel 通过国家码进行功率限制和wifi eFEM 基本配置和wifi Tx SEM问题

本文介绍了WiFi功率限制配置和eFEM硬件设置方法。在功率限制方面,通过国家码可针对不同信道设置功率上限,需在rlm_txpwr_init.h文件中配置信道和功率值(单位0.5dBm),WiFi6的HE_TB模式还可分RU设置。eFEM硬件配置需参考平台设计,注意VDET接口处理,首次使用建议提交HW/SW案例审核。软件配置需获取专用FEM包,包含NVRAM、GPIO等文件,按指导合并后版本才会切换为eFEM版本。

专业开发者的博客,一个从事Android WiFi和蓝牙的工程师 483

POJ--2286[The Rotation Game] IDA*

剪枝:每次不要往反方向搜。注意:长度相同要输出字典序最小的操作PS.一开始是用状态压缩+BFS的,结果无情的TLE了、、、  估价函数:int h(int st[])//估价函数 { int i,num[4]={0}; for(i=0;i<8;i++) num[s

___简言 749

白话FOC控制中各环节的参数的意义与如何设置参数

FOC参数整定是控制系统的关键环节,如同驯马需要调节"智能马鞍"。核心参数分为三类:电流环参数(P/I/D)决定响应速度和稳定性,速度环参数需慢于电流环5-10倍带宽,系统参数(极对数、电阻等)是电机固有属性必须准确设置。调参心法:由内而外先调电流环,遵循先P后I慎用D原则,内环带宽必须大于外环。利用自动辨识工具,通过听觉(滋滋声表示P过大)和波形观察来微调,最终实现精准控制。

汽车软件开发 356

八数码问题

题目描述 在一个3*3的棋盘上放置编号为1-8的8个方块,每个占一格,另外还有一个空格。与空格相邻的数字方块可以移动到空格里。任务1:指定初始棋局和目标棋局,计算出最少的移动步数;任务2:输出数码的移动序列。 把空格看成0,一共有9个数字。 输入样例: 1 2 3 0 8 4 7 6 5 1 0 3 8 2 4 7 6 5 输出样例: 2 题目分析 这里先解决任务1,任务2是在任务1的基础上通过标记序列和回溯去解决的。 把一个棋局看成一个状态图,总共有9!= 362880个状态。从初始棋局开始,每次移

weixin_47750287的博客 1905

23、资产分散化与有效前沿:投资组合优化的核心策略

本文深入探讨了现代投资组合理论的核心概念,包括分散投资的重要性、均值-方差优化框架以及有效前沿的构建与应用。通过案例分析和数学模型,阐述了如何通过科学方法降低投资组合风险并实现最优风险收益权衡。文章还介绍了实际应用中的求解方法与决策流程,为投资者提供系统的投资组合优化指导。

cc789的博客 114

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

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

八数码 POJ1077 (康托展开与奇偶排列详解)

题目链接 八数码问题有多种解决方法,在这里只具体讲述一下康托展开在状态压缩中的应用。 题意: 输入一段数字序列,表示3×3棋盘0到8的一种排列状态,要求计算从初始状态到达目标状态(1 2 3 4 5 6 7 8 0)所需的最少步数,并输出操作过程。 思路: 本题的关键是标记每一种可能扩展到的状态,由于所有的状态个数对应的是9的全排列,如果仅仅是简单地扩展标记数组的维度必然会超内存,所以此时...

Keep eating codes! 849

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

poj-1077(bfs+康托展开)

原题链接http://poj.org/problem?id=1077 大概题意就是把你输入的九宫格变成目标九宫格(大概小时候都玩过这种游戏,复原九宫格),然后输出每次移动的方向。不了解康托展开的可以百度一下,对全排列的判重很有用。提交的时候c++一直超时,改来改去还是不行,改成g++就ac了,郁闷。 代码如下(附有题解) #include<iostream> #include<q...

weixin_45732455的博客 432

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

POJ-2286 IDA*搜索(迭代加深搜索算法)

IDA*搜索又成为迭代加深搜索,感觉迭代加深这个称谓就基本概括了这种搜索算没的核心。首先所以讨论一下什么迭代加深搜索,深度优先搜索一个局面可以搜索很多很多层,这种情况很可能时间啊复杂度很大;怎么办呢?聪明的人们想到了限制限制了搜索深度,正是所谓的迭代加深搜索,就是在深度无上限的情况下,先预估一个深度(尽量小)进行搜索,如果没有找到解,再逐步放大深度搜索。这种方法虽然会导致重复的遍历 某些结点,但是...

samscream的博客 3448

POJ 2286 - The Rotation Game IDA(迭代加深搜索,DFSID)

IDA是在迭代加深搜索中应用的...作用是用一个估价函数减少不必要的搜索...如本题...8-(中间最多的数的个数)+当前深度>卡的深度..就剪掉...因为一次移动最多使中间的某个数的个数增加一个...这里的"8-(中间最多的数的个数)"就相当于对当前状态的一个估价函数..实现了高效的剪枝...     再一个..搜索的时候最好"轻装上阵"...之前我偷懒在DFSID(....)带了很多函数..

zzyzzy12 1350

【POJ1077】Eight 八数码问题,解题报告+思路+代码

#include #include #include #define INPUT using namespace std; /** Problem : poj1077,hdu1043,经典的八数码问题。 知识点: BFS + HASH + 打表 + 父亲节点记录 境界:3 - BFS+HASH+打表 A了两天!!! 记得拿启发式,双向BFS重新写

c0de4fun的完美算(nei)法(he)教室-我们仍不知道,那天调用的驱动的名字。 5777

poj1077

8数码,无解情况为逆序数为奇数,用康托展开压缩成一个int来判重 这个是单组输入 所以我们来一组搜一次 这里给出bfs和A* A*的话,你可以使用曼哈顿距离,当然,由于不用最少步数,可以用3倍曼哈顿距离加速 IDA*的话,用曼哈顿距离 bfs #include<iostream> #include<cstdio> #include<queue> ...

思维缜密的博客 429

poj2286(IDA*)

解题思路:以前知道IDA*比较简单,所以没怎么练,今天练一次试试。IDA*其实就是加上估计函数的迭代加深搜索(不断增加深度,与A*相比节约内存,但会重复搜索)。加不加估计函数真的是效果完全不一样。不加就超时(我见过一些玄学估计函数,但我这次选的估计函数不是玄学)。 代码摘自https://www.cnblogs.com/nwpuacmteams/articles/5658403.html 写得...

qq_39861441的博客 388

poj 2286 (自己对IDA*的一些理解)

原博客地址:http://blog.youkuaiyun.com/t1019256391/article/details/925724315s的时间,150000kb的内存,一眼就让人想到广搜,但状态实在太多,3^25-1种吧,想写又没下手。。。其实这是一道IDA*的题目。顺便讲一下自己对IDA*的理解:1、什么是IDA*? 是结合深搜和广搜二者优势的一种算法,深搜内存消耗少,路径容易保存,状态少,但不能保证最

Davenny:~我今天该吃点什么捏~ 651

POJ2286+IDA*算法

IDA*算法搞下 就行,hash不了,只需要剪枝,前一移动顺序不是现在移动的逆过程就ok/*IDA*算法*/ #include #include #include #include using namespace std; int a[25],depth; bool ok(int * p) { int k=p[7]; return (k==p[8])&&(k==p[9])&&(k==p[12]

终究我要华丽逆袭 1725

poj2331 ida*

用最少的管子数,连接平面上的两点,只允许横放或竖放,允许交叉或重叠 方法:先搜x轴,再搜y轴 预处理估价函数 还是觉得很唯美~ #include #include #include using namespace std; struct data { int l,num; }a[10]; int n,sx,sy,tx,ty,h1[1010],h2[1010],total

浅空之下 1433

【POJ2286】The Rotation Game

The Rotation Game Time Limit: 15000MS   Memory Limit: 150000K Total Submissions: 6062   Accepted: 2039 Description The rotation game uses a # shaped board, which can hold

SunIsMe的博客 2126
上一篇: poj1945 A*,hash,heap,gcd剪枝
下一篇: poj2331 ida*
琴空
博客等级 码龄16年 48粉丝 82原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值