首页 > 其他分享 >2.八数码二(IDA*)

2.八数码二(IDA*)

时间:2023-04-06 17:26:18浏览次数:44  
标签:return int ed st 数码 path include IDA

原题链接:https://www.acwing.com/problem/content/4231/

//IDA*
#include<iostream>
#include<cstring>
#include<algorithm>
#include<unordered_map>
#include<queue>
#include<cmath>
using namespace std;

#define x first
#define y second
typedef pair<int,string> PIS;
char op[4]={'d','l','r','u'};
int dx[4]={1,0,0,-1},dy[4]={0,-1,1,0};
int pos[10];//pos记录每一个数字在ed中的下标
int path[101000];
string st,ed;

int f()
{
    int res=0;
    for(int i=0;i<9;i++)
    {
        if(st[i]!='X')
        {
            int a=st[i]-'0';
            res+=abs(i/3-pos[a]/3)+abs(i%3-pos[a]%3);
        }
    }
    return res;
}

bool dfs(int k,int depth)
{
    if(k+f()>depth) return false;
    if(st==ed) return true;
    int x1,y1;
    for(int i=0;i<9;i++)
        if(st[i]=='X') x1=i/3,y1=i%3; 
    string last=st;
    for(int i=0;i<4;i++)
    {
        int x=dx[i]+x1,y=dy[i]+y1;
        //重要剪枝,避免往回走
        if(k>=1&&i+path[k-1]==3) continue;
        if(x<0||x>=3||y<0||y>=3) continue;
        swap(st[x1*3+y1],st[x*3+y]);
        path[k]=i;
        if(dfs(k+1,depth)) return true;
        swap(st[x1*3+y1],st[x*3+y]);
    }
    return false;
}

int main()
{
    int tt;
    cin>>tt;
    for(int i=1;i<=tt;i++)
    {
        cin>>st>>ed;
        string s=st;
        for(int j=0;j<9;j++){
            if(ed[j]!='X'){
                int a=ed[j]-'0';
                pos[a]=j;
            }
        }
        int depth=0;
        while(!dfs(0,depth)) depth++;
        printf("Case %d: %d\n",i,depth);
        for(int i=0;i<depth;i++) cout<<op[path[i]];
        cout<<endl;
    }
    
    return 0;
}

标签:return,int,ed,st,数码,path,include,IDA
From: https://www.cnblogs.com/linearlearn/p/17293430.html

相关文章

  • 1.八数码
    原题链接:https://www.acwing.com/problem/content/description/181/A*的重点在于利用优先队列记录到达当前节点的真实距离加上从当前节点出发到终点的估计距离,用该信息作为第一关键字来处理各个状态。在四个方向处理时要注意恢复状态。#include<iostream>#include<queue>#inc......
  • 报错ValidationError: Progress Plugin Invalid Options (非常重要)
    此方法可以解决:使用Vue-ptf时报错:maintemplate.hooks.hotbootstraphasbeenremoved(useyourownruntimemodule和package-lock.json导包( less,lessloader)和(npminstallpdfjs-dist--save)等后出现ValidationError:ProgressPluginInvalidOptions两种问......
  • BOSHIDA 电源模块使用时注意事项 ACDC DCDC
    电源模块需轻拿轻放,避免撞击或跌落造成产品损坏;禁止拆开产品外壳,禁止触摸电源内部任何器件,以避免产品遭受静电、器件应力等易损坏的情况;电源模块通电后,不要靠近模块或触摸外壳,避免模块异常工作时可能对身体造成伤害;在产品通电之前,请确认并严格按照产品技术手册,正确连接产品的输......
  • unidac分页
    unidac分页unidac的组件uniquery有两个个属性就可以轻松实现。但是这样做,你必须要写一条语句查出总记录来赋值给label才知道总共有多少记录哦,而且不能完美使用cxgrid、dbgrideh自带的过滤功能(因为刚开始只能100条数据,你是不能过滤100以后的符合条件的记录的)。FetchRows可以设定一......
  • LCD液晶驱动/LED数码管驱动IC原厂;单键/多键触摸触控芯片厂家-VINKA/永嘉微电,FAE技术支
        深圳市永嘉微电科技有限公司成立于2013年,是一家以集成电路开发、测试、销售为主的高科技公司。公司的产品涵盖触控、健康量测、工控仪表、航模、小家电,车用及安全监控与智能家居等应用领域,此外还提供各种触摸、LCD/LED驱动、电源管理、MCU及各类控制芯片。   ......
  • 小梅哥课程学习——数码管动态扫描显示的verilog实现(C)
    1//动态数码管扫描,通过这种方式可以节约引脚2//可以使用三八译码器来切换数码管位3//要求每个数码管每20ms都要点亮一次,20/8=2.5ms4//源代码1用的是组合逻......
  • frida class里面有哪些属性
    varhook_cls=Java.use(class_name)if(class_name.includes("DynamicCheck")){console.log("==================")......
  • 反序列化-字段选项 validate、validate_<字段>、validator
    1.使用序列化器进行反序列化时,需要对数据进行验证后,才能获取验证成功的数据或保存成模型类对象。2.在获取反序列化的数据前,必须调用is_valid()方法进行验证,验证成功返回Tr......
  • 89.神州数码、华为、东软笔试题
    89.神州数码、华为、东软笔试题1.2005年11月15日华为软件研发笔试题。实现一单链表的逆转。2.编码实现字符串转整型的函数(实现函数atoi的功能),据说是神州数码笔试题......
  • 从零开始搞一个androidApp,实现h5自动更新、jsbridge
    准备window电脑javajdk(包含了javajre)下载安装androidsdk下载安装androidstudio下载安装gradle下载一台带sim卡的android手机nodejs下载安装 npminstall-g......