传送门

1.先用dfs枚举9!的全排列,存到hash数组里(类似离散化),因为顺序枚举,就不需要排序了

2.朴素bfs,判重就用二分找hash;如果发现当前状态=要求状态,输出步数结束程序

上代码

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;

; 

long long hash[MAXHASH];
bool hashbook[MAXHASH];
;
];

;

void hinit(long long step,long long val){
    ){
        hn++;
        hash[hn]=val;
        return;
    }
    ;i<=;i++){
        ){
            hinit_book[i]=;
            hinit(step+,val*+i);
            hinit_book[i]=;
        }
    }
}

bool hashput(long long val){
    ,r=hn;
    for(;;){
        if(l==r){
            ){
                hashbook[l]=;
                ;
            }else{
                ;
            }
        }
        ;
        if(val>hash[mid]){
            l=mid+;
        }else{
            r=mid;
        }
    }
}

struct uct1{
    long long data;
    long long pos;
    long long step;
}que[];

long long mywap(long long data,long long pa,long long pb){
    long long ans=data;

    ,-pb+)-data%(,-pb);
    ans-=df;
    ans+=df/pow(,-pb)*pow(,-pa);

    df=data%(,-pa+)-data%(,-pa);
    ans-=df;
    ans+=df/pow(,-pa)*pow(,-pb);
    return ans;
}

,tail=;

int main() {
    hinit(,);
    long long pig;
    cin>>pig;

    int bap=pig;
    if(pig==end){
        cout<<;
        ;
    }
    int pigpos;
    ;bap>;pigpos--){
        ==){
            break;
        }
        bap=bap/;
    }
    ){
        pigpos=;
    }
    head=;
    tail=;
    que[tail].data=pig;
    que[tail].pos=pigpos;
    que[tail].step=;
    tail++;
    for(;head<tail;){
        int tdata;
        int tpos;
        ]={};
        for(;;){
            )%==&&flag[]==){
                tdata=mywap(que[head].data,que[head].pos,que[head].pos+);
                tpos=que[head].pos+;
                flag[]++;
            })%==&&flag[]<){
                ]==){
                    tdata=mywap(que[head].data,que[head].pos,que[head].pos+);
                    tpos=que[head].pos+;
                }else{
                    tdata=mywap(que[head].data,que[head].pos,que[head].pos-);
                    tpos=que[head].pos-;
                }
                flag[]++;
            })%==&&flag[]==){
                tdata=mywap(que[head].data,que[head].pos,que[head].pos-);
                tpos=que[head].pos-;
                flag[]++;
            }&&que[head].pos<=&&flag[]==){
                tdata=mywap(que[head].data,que[head].pos,que[head].pos+);
                tpos=que[head].pos+;
                flag[]++;
            }&&que[head].pos<=&&flag[]<){
                ]==){
                    tdata=mywap(que[head].data,que[head].pos,que[head].pos+);
                    tpos=que[head].pos+;
                }else{
                    tdata=mywap(que[head].data,que[head].pos,que[head].pos-);
                    tpos=que[head].pos-;
                }

                flag[]++;
            }&&que[head].pos<=&&flag[]==){
                tdata=mywap(que[head].data,que[head].pos,que[head].pos-);
                tpos=que[head].pos-;
                flag[]++;
            }else{
                break;
            }
            if(tdata==end){
                cout<<que[head].step+;
                ;
            }
            ){
                que[tail].data=tdata;
                que[tail].pos=tpos;
                que[tail].step=que[head].step+;
                tail++;
            }
        }
        head++;
    }
    ;
}

其实还可以用双向bfs优化,算hash数组可以用康托展开

但懒得写了(逃)

洛谷P1379 八数码难题的更多相关文章

  1. 洛谷 P1379 八数码难题 解题报告

    P1379 八数码难题 题目描述 在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格,空格用0来表示.空格周围的棋子可以移到空格中.要求解的问题是:给出一种初始布局(初 ...

  2. 洛谷——P1379 八数码难题

    P1379 八数码难题 双向BFS 原来双向BFS是这样的:终止状态与起始状态同时入队,进行搜索,只不过状态标记不一样而已,本题状态使用map来存储 #include<iostream> ...

  3. 洛谷P1379八数码难题

    题目描述 在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格,空格用0来表示.空格周围的棋子可以移到空格中. 要求解的问题是:给出一种初始布局(初始状态)和目标布局(为 ...

  4. 洛谷 P1379 八数码难题 Label:判重&&bfs

    特别声明:紫书上抄来的代码,详见P198 题目描述 在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格,空格用0来表示.空格周围的棋子可以移到空格中.要求解的问题是:给 ...

  5. 洛谷 P1379 八数码难题

    题目描述 在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格,空格用0来表示.空格周围的棋子可以移到空格中.要求解的问题是:给出一种初始布局(初始状态)和目标布局(为了 ...

  6. 洛谷 - P1379 - 八数码难题 - bfs

    https://www.luogu.org/problemnew/show/P1379 #include <bits/stdc++.h> using namespace std; #def ...

  7. 洛谷—— P1379 八数码难题

    https://daniu.luogu.org/problem/show?pid=1379 题目描述 在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格,空格用0来表示 ...

  8. 洛谷 P1379 八数码难题 题解

    我个人感觉就是一道bfs的变形,还是对bfs掌握不好的人有一定难度. 本题思路: 大体上用bfs搜,用map来去重,在这里只需要一个队列,因为需要较少步数达到的状态一定在步数较多的状态之前入队列. # ...

  9. 洛谷 P1379 八数码难题(map && 双向bfs)

    题目传送门 解题思路: 一道bfs,本题最难的一点就是如何储存已经被访问过的状态,如果直接开一个bool数组,空间肯定会炸,所以我们要用另一个数据结构存,STL大法好,用map来存,直接AC. AC代 ...

随机推荐

  1. vue 中 echart 在子组件中只显示一次的问题

    问题描述 一次项目开发过程中,需要做一些图表,用的是百度开源的 echarts. vue推荐组件化开发,所以就把每个图表封装成子组件,然后在需要用到该图表的父组件中直接使用. 实际开发中,数据肯定都是 ...

  2. Entity Framework入门教程(1)---Entity Framework简介

    什么是Entity Framework 学习EF的前提:熟练使用Linq和Ado.net,因为在使用EF框架进行开发时,我们大多数情况使用Linq进行查询和操作,而EF的底层实现用的是Ado.net. ...

  3. [物理学与PDEs]第2章习题6 有旋的 Navier-Stokes 方程组

    试证明: 由 Navier-Stokes 方程组描述的流体运动一般总是有旋的, 即若 $\rot{\bf u}={\bf 0}$, 则 Navier-Stokes 方程组 (3. 4)-(3. 5) ...

  4. [物理学与PDEs]第1章第1节 引言

    1. 电动力学研究的对象是电磁场, 研究电磁场的基本属性---运动规律及它和带电物质的相互作用. 2. 场, 物质的一种存在方式. 3. Maxwell 方程组是电动力学中的基本方程, 是一切有关电磁 ...

  5. java包

    首先是java.io java.lang java.util  java.lang.math

  6. iTOP-4418开发板和6818开发板-第五路串口介绍

    iTOP-4418开发板和6818开发板 的除去默认 4 个串口的配置和用法. 4418 的开发板最多支持 5 路串口,如下图所示,4418 的 datasheet.   6818 的开发板最多支持 ...

  7. java 面经

    1.什么是Java虚拟机(JVM)?为什么Java被称作是“平台无关的编程语言”? Java虚拟机是一个可以执行Java字节码的虚拟机进程.Java源文件被编译成能被Java虚拟机执行的字节码文件. ...

  8. 老师博客copy -高阶函数2

    新闻 管理   Py西游攻关之函数   一 函数是什么? 函数一词来源于数学,但编程中的「函数」概念,与数学中的函数是有很大不同的,具体区别,我们后面会讲,编程中的函数在英文中也有很多不同的叫法.在B ...

  9. orm总结

    x先谈谈java方面的. mybatis优点是基本啥都有了,sql统一管理,只需接口就可以了,缺点是对于复杂语句的执行还是麻烦,一般还是在程序里解决,自带的动态sql功能较弱不说,重点是调式时还是麻烦 ...

  10. .NET垃圾回收机制(二)

    一.GC的必要性 1.应用程序对资源操作,通常简单分为以下几个步骤:为对应的资源分配内存 → 初始化内存 → 使用资源 → 清理资源 → 释放内存. 2.应用程序对资源(内存使用)管理的方式,常见的一 ...