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

Ubuntu Server 22.04.5系统安装教程

该教程主要是演示在服务器上安装Ubuntu server 22.04系统的详细步骤,主要包含,安装系统前的准备(镜像的下载,启动盘的制作),安装系统时的语言选择,网络设置,切换镜像源(可根据实际需求来配置,本文使用清华镜像源),手动分区,用户设置,ssh服务安装等。以上就是关于Ubuntu Server 22.04系统安装的详细过程。

逆水行舟,不进则退。 7761

poj 1077 Eight

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

zjsru_Beginner的博客 574

UNITE真菌数据库使用避坑指南:从下载到注释的完整流程

本文提供了UNITE真菌数据库从下载到注释的完整实战指南。针对真菌ITS序列分析,重点解析了数据库版本选择、格式转换的常见陷阱,并详细介绍了如何训练优化的sklearn分类器以提升物种注释的精度和可靠性,帮助用户构建高效稳定的本地工作流。

weixin_29240343的博客 199

ENVI SARscape安装全攻略:从下载到汉化一步到位(附最新试用申请链接)

本文提供ENVI SARscape从下载安装到汉化的完整指南,特别针对InSAR(合成孔径雷达干涉测量)分析环境搭建。详细介绍了系统要求、分步安装流程、汉化优化方法及硬件加速配置,并分享数据处理验证和常见问题解决方案,帮助用户高效搭建遥感数据分析平台。

rnn9storyteller的博客 1407

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

IGBT基础知识及应用电路仿真(Multisim)

本文系统介绍了IGBT(绝缘栅双极晶体管)及其应用电路。首先详细解析了IGBT的基本结构、工作原理和特性参数,重点阐述了其五层半导体结构、电导调制效应和电压驱动特性。随后通过Multisim仿真展示了IGBT在四种典型功率变换电路中的应用:半桥驱动电路实现隔离式互补驱动;全桥逆变电路完成DC-AC转换;三相桥式逆变电路生成三相交流电;直流斩波电路(BUCK/BOOST/BUCK-BOOST)实现电压升降变换。文章通过理论分析与仿真波形相结合,全面呈现了IGBT在中高压大功率场景下的优异性能和灵活应用。

XU157303764的博客 1217

POJ 1077 八数码 三种解法

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

lvxin1204的博客 5398

基于Simulink的电动汽车电池管理系统热管理优化仿真

电动汽车电池管理系统(Battery Management System, BMS)中的热管理是确保电池性能、安全性和寿命的关键环节。温度过高或过低都会显著影响电池的工作效率和寿命,因此需要对电池组进行精确的热管理。基于MATLAB/Simulink的仿真平台可以用于建模和优化电池热管理系统,包括热分布预测、冷却策略设计以及热平衡控制等。本项目旨在构建一个完整的电动汽车电池热管理优化仿真模型,并通过仿真验证系统的性能。

xiaoheshang_123的博客 461

Orin 调试GMSL camera 96712手册重点

96712基础理解

乐于分享 9186

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

从零实现深度学习框架——自动求导神器计算图

本文介绍自动求导神器——计算图,从本篇文章开始介绍一个自定义的求导工具。

日积月累,天道酬勤 4198

八数码问题

题目描述 在一个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

回归预测 | MATLAB实现TCN时间卷积神经网络多输入单输出回归预测

回归预测 | MATLAB实现TCN时间卷积神经网络多输入单输出回归预测

机器学习之心的博客,关注并私信文章链接,获取对应文章源码和数据。 2490

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

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

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

Keep eating codes! 849

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

poj-1077(bfs+康托展开)

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

weixin_45732455的博客 432

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

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、付费专栏及课程。

余额充值