这题需要用数组记录每个block的位置。启发函数:d+wa(8-当前最多相同个数)>maxd直接退出

AC代码:

#include<cstdio>
#include<cstring> //IDA* 每次旋转最多只能增加一个相同的 启发函数:d+wa<=maxd
#include<algorithm>
using namespace std;
int block[24];
int pos[8][7]={
{0,2,6,11,15,20,22},{1,3,8,12,17,21,23},
{10,9,8,7,6,5,4},{19,18,17,16,15,14,13},
{23,21,17,12,8,3,1},{22,20,15,11,6,2,0},
{13,14,15,16,17,18,19},{4,5,6,7,8,9,10}
};
int goal[8]={6,7,8,11,12,15,16,17};
int dis[100000]; //记录步骤

void turn(int dir){
    int fir=block[pos[dir][0]];
    for(int i=0;i<6;++i){
        block[pos[dir][i]]=block[pos[dir][i+1]];
    }
    block[pos[dir][6]]=fir;
}
bool is_ok(){
    for(int i=0;i<7;++i){
        if(block[goal[i]]!=block[goal[i+1]]) return false;
    }
    return true;
}

bool dfs(int d,int maxd){
    if(is_ok()){  //找到答案
        if(!maxd) printf("No moves needed\n%d\n",block[6]);
        else {
            for(int i=0;i<maxd;++i)
                printf("%c",dis[i]+'A');
            printf("\n%d\n",block[6]);
        }
        return true;
    }
    //判断当前是否有可能在maxd下得到正确答案
    int a=0,b=0,c=0;
    for(int i=0;i<8;++i){
        if(block[goal[i]]==1) ++a;
        else if(block[goal[i]]==2) ++b;
        else if(block[goal[i]]==3) ++c;
    }
    int wa=8-max(max(a,b),c);
    if(d+wa>maxd) return false;

    int old[24];
    memcpy(old,block,sizeof(block));
    for(int i=0;i<8;++i){
        dis[d]=i;
        turn(i);
        if(dfs(d+1,maxd)) return true;
        memcpy(block,old,sizeof(old));
    }
    return false;
}
int main() {
    while(1){
        for(int i=0;i<24;++i) {
            scanf("%d",&block[i]);
            if(!block[i]) return 0;
        }
        for(int maxd=0;;++maxd){
            if(dfs(0,maxd)) break;
        }
    }
    return 0;
}

如有不当之处欢迎指出!

uva1343 IDA*的更多相关文章

  1. IDA*(以The Ratotion Game POJ--2286 UVa1343为例)

    IDA*算法实质就是迭代加深搜索和A*算法的结合,通过迭代加深搜索来寻找答案,借由预估函数h()来进行估计与剪枝. 本题主框架如下: ;;maxd++) { ,maxd)) break; } 由1开始 ...

  2. UVA-1343 The Rotation Game (IDA*)

    题目大意:数字1,2,3都有八个,求出最少的旋转次数使得图形中间八个数相同.旋转规则:对于每一长行或每一长列,每次旋转就是将数据向头的位置移动一位,头上的数放置到尾部.若次数相同,则找出字典序最小旋转 ...

  3. UVa 1343 旋转游戏(dfs+IDA*)

    https://vjudge.net/problem/UVA-1343 题意:如图所示,一共有8个1,8个2和8个3,如何以最少的移动来使得中间8个格子都为同一个数. 思路:状态空间搜索问题. 用ID ...

  4. UVa 1343 The Rotation Game (状态空间搜索 && IDA*)

    题意:有个#字型的棋盘,2行2列,一共24个格. 如图:每个格子是1或2或3,一共8个1,8个2,8个3. 有A~H一共8种合法操作,比如A代表把A这一列向上移动一个,最上面的格会补到最下面. 求:使 ...

  5. 逆向工程 - Reveal、IDA、Hopper、HTTPS抓包 等

    目录: 一. iOS 如何做才安全 二.ipa文件 三.沙盒 中的数据 四.Reveal:查看 任何APP 的UI结构 五.反编译工具:IDA 六.反编译工具:Hopper Disassembler ...

  6. IDA的脚本IDC的一个简单使用

    目的:主要是想学习一下IDA的IDC的脚本的使用.这里做了一个小的测试. 这里使用的是VS2015Community来生成文件的. 一.编写测试程序: 这里先生成我们的目标数据. 然后编写测试程序.得 ...

  7. 安卓动态调试七种武器之孔雀翎 – Ida Pro

    安卓动态调试七种武器之孔雀翎 – Ida Pro 作者:蒸米@阿里聚安全 0x00 序 随着移动安全越来越火,各种调试工具也都层出不穷,但因为环境和需求的不同,并没有工具是万能的.另外工具是死的,人是 ...

  8. iOS程序逆向Mac下常用工具——Reveal、HopperDisassemble、IDA

    原文在此 一.Reveal 1 一般使用     Reveal是ITTY BITTY发布的UI分析工具,可以很直观的查看App的UI布局.如下图所示:     Reveal是需要付费的,需要89美元, ...

  9. IDA插件栈字符串识别插件

    该插件是一款可以自动识别栈上局部变量为字符串的插件,字符串形式如下,并自动的加上注释                                       如图:可以自动识别栈上的字符串 项目主 ...

随机推荐

  1. junit断言总结

    我们平时编写自己的测试类,如果没有断言,那么就没写测试的必要了. JUnit框架用一组assert方法封装了最常见的测试任务.这些assert方法可以极大地简化单元测试的编写. Assert类包含了一 ...

  2. [DeeplearningAI笔记]改善深层神经网络_优化算法2.3_2.5_带修正偏差的指数加权平均

    Optimization Algorithms优化算法 觉得有用的话,欢迎一起讨论相互学习~Follow Me 2.3 指数加权平均 举个例子,对于图中英国的温度数据计算移动平均值或者说是移动平均值( ...

  3. rabbitMQ的安装和配置(一)

    erlang是一门面向并发的编程语言,流行的消息队列rabbitMQ是基于erlang环境运行的: 系统环境 操作系统:oracle-linux7.3 erlang版本:otp_src_20.0 下载 ...

  4. template()方法

    template(id, data)方法: id:必传,渲染模板的id. data:可选,一个Object对象. return:传data—>渲染完成html代码:不传data—>一个渲染 ...

  5. OpenStack和Hadoop的区别

    其实,OpenStack和Hadoop不是同一个层次的东西,无法比较,非要说出个区别,那就是:OpenStack是云计算管理平台,应该是属于系统级别的软件,它的主体思想是把资源进行分离,给不同的用户提 ...

  6. ABP官方文档翻译 9.3 NHibernate集成

    NHibernate集成 Nuget包 配置 实体映射 仓储 默认实现 自定义仓储 应用程序特定基础仓储类 ABP可以使用任何ORM框架,它内置集成NHibernate.此文档将讲解ABP如何使用NH ...

  7. POJ2891 Strange Way to Express Integers [中国剩余定理]

    不互质情况的模板题 注意多组数据不要一发现不合法就退出 #include <iostream> #include <cstdio> #include <cstring&g ...

  8. 使用sed修改配置项的值

    起先我的想法是根据等号来求得配置项所在的行号, sed -n '/aaa/=' config.ini 然后根据行号删除这一行,再增加一行比如行号是9 sed -i  '9d' config.ini s ...

  9. txt文本文件记录日志

    private static void Log(string content, string fileName="log.txt") { string logsPath = App ...

  10. Composer 结合 Git 创建 “服务类库”

    Composer 结合 Git 创建 "服务类库" 我一直认为,现在的 PHP 已经进展到了工程化的领域.以前的 PHP 开发者,以快为美,速度和规模永远都是矛盾体.现在的 PHP ...