八数码问题【康托展开+BFS】

2023-11-05

/ Vijos / 题库 / 八数码问题


背景

Yours和zero在研究A*启发式算法.拿到一道经典的A*问题,但是他们不会做,请你帮他们.

描述

在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字。棋盘中留有一个空格,空格用0来表示。空格周围的棋子可以移到空格中。要求解的问题是:给出一种初始布局(初始状态)和目标布局(为了使题目简单,设目标状态为123804765),找到一种最少步骤的移动方法,实现从初始布局到目标布局的转变。

格式

输入格式

输入初试状态,一行九个数字,空格用0表示

输出格式

只有一行,该行只有一个数字,表示从初始状态到目标状态需要的最少移动次数(测试数据中无特殊无法到达目标状态数据)

样例1

样例输入1

283104765

Copy

样例输出1

4

  尽管这道题的题意上说要用启发式搜索来做,但是我没有启发的idea!直接暴力康托展开加上BFS,然后直接输出答案,因为时间复杂度最高就是O(9 !)所以,还是暴力吧。

#include <iostream>
#include <cstdio>
#include <cmath>
#include <string>
#include <cstring>
#include <algorithm>
#include <limits>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#include <map>
#define lowbit(x) ( x&(-x) )
#define pi 3.141592653589793
#define e 2.718281828459045
#define INF 0x3f3f3f3f
#define HalF (l + r)>>1
#define lsn rt<<1
#define rsn rt<<1|1
#define Lson lsn, l, mid
#define Rson rsn, mid+1, r
#define QL Lson, ql, qr
#define QR Rson, ql, qr
#define myself rt, l, r
#define MP(x, y) make_pair(x, y)
using namespace std;
typedef unsigned long long ull;
typedef long long ll;
const int maxN = 363000;
const int dir[4][2] =
{
    -1, 0,
    0, -1,
    0, 1,
    1, 0
};
int jc[10];
string ans[maxN];
int step[maxN];
bool vis[maxN];
inline int Cantor(int len, string a)    //康托展开
{
    int tmp, sum = 0;
    for(int i=0; i<len; i++)
    {
        tmp = 0;
        for(int j=i+1; j<len; j++)
        {
            if(a[i] > a[j]) tmp++;
        }
        sum += tmp * jc[len - i - 1];
    }
    return sum + 1; //排名+1
}
inline int _id(int x, int y) { return (x - 1) * 3 + y - 1; }
inline bool In_map(int x, int y) { return x > 0 && y > 0 && x <= 3 && y <= 3; }
struct node
{
    int x0, y0;
    string s;
    node(int a=0, int b=0, string c=""):x0(a), y0(b), s(c) {}
};
inline void bfs()
{
    node now = node(2, 2, "123804765"), nex;
    queue<node> Q;
    Q.push(now);
    int sta = Cantor(9, now.s), las;
    vis[sta] = true; step[sta] = 0;
    while(!Q.empty())
    {
        now = Q.front(); Q.pop();
        sta = Cantor(9, now.s);
        for(int i=0, xx, yy; i<4; i++)
        {
            xx = now.x0 + dir[i][0]; yy = now.y0 + dir[i][1];
            if(!In_map(xx, yy)) continue;
            nex = now;
            swap(nex.s[_id(now.x0, now.y0)], nex.s[_id(xx, yy)]);
            nex.x0 = xx; nex.y0 = yy;
            las = Cantor(9, nex.s);
            if(!vis[las])
            {
                vis[las] = true;
                step[las] = step[sta] + 1;
                Q.push(nex);
            }
        }
    }
}
int F[10];
string A;
int main()
{
//    freopen("cowjog.in", "r", stdin);
//    freopen("cowjog.out", "w", stdout);
    jc[0] = jc[1] = 1;
    for(int i=2; i<=9; i++) jc[i] = jc[i-1] * i;
    memset(vis, false, sizeof(vis));
    bfs();
    cin>>A;
    printf("%d\n", step[Cantor(9, A)]);
    return 0;
}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

八数码问题【康托展开+BFS】 的相关文章

  • 汽车加油行驶问题【网络流24题】【可以使用BFS】

    题目链接 这道题虽然说是网络流24题中的一题 但是我的第一想法确实去用BFS 跑一个最小的花费 但是由于加油的钱 向后走的钱 开设一个新的加油站的钱是不固定的 所以 我们需要进行相应的判断 跑所有可以达到终点的值去比较大小 include
  • 【定理】算术基本定理(唯一分解定理)

    大蒟蒻来水贴了 算术基本定理 唯一分解定理 一句话 任何大于 的自然数 都可以唯一分解成有限个质数的乘积 例如对于大于1的自然数n 这里P i i均为质数 其指数a i i是正整数 这样的分解称为的标准分解式 唯一分解定理具有 唯一性 分配
  • 【学习笔记】大指数的两种处理方法——欧拉降幂和数学模拟

    问题背景 描述 题目范围 我们可以看到 y 的数位最长达1e5 1 远远超过了任何一个数据类型的范围 那我们如何计算像这样的大指数呢 有两种解决方法 我们先学习第一种 算法 欧拉降幂 对于算法欧拉降幂 你需要知道的东西有 1 欧拉函数 2
  • 【4月第二周学习记录】数据结构与算法王卓-第六章图-图的遍历(邻接矩阵与邻接表,DFS与BFS)

    1 图的遍历基本思路与方法 图的遍历的定义与visited数组 常用的遍历方法 深度优先搜索遍历 Depth First Search DFS 广度优先搜索遍历 Breadth First Search BFS 2 深度优先搜索遍历 Dep
  • LeetCode_433. 最小基因变化

    题目链接 力扣 这道题是一道经典的BFS题型 我觉得可能会踩坑导致不能一次AC的地方有两处 一是bankSize可能为0 那么我们开辟一个记录数组的时候会报错 二是题目所说的 起始基因序列 start 默认是有效的 但是它并不一定会出现在基
  • 牛客周赛 Round 4---游游的因子计算

    输入 6 2 输出 6 1 2 3 4 6 12 解析 如果一个数 x 是 a 的因子 y是b的因子 那么x y一定是a b的因子 试除法分别获取a和b的因子 然后两层遍历的所有 a i b j 的所有情况即为答案 include
  • 八数码问题【康托展开+BFS】

    Vijos 题库 八数码问题 背景 Yours和zero在研究A 启发式算法 拿到一道经典的A 问题 但是他们不会做 请你帮他们 描述 在3 3的棋盘上 摆有八个棋子 每个棋子上标有1至8的某一数字 棋盘中留有一个空格 空格用0来表示 空格
  • 【BZOJ 2219】【超详细题解】数论之神

    2219 数论之神 Time Limit 3 Sec Memory Limit 259 MB Submit 365 Solved 33 Submit Status Discuss Description 在ACM DIY群中 有一位叫做 傻
  • 层序遍历与BFS广度(宽度)遍历搜索算法(C++)

    算法竞赛 file author jUicE g2R qq 3406291309 彬 bin 必应 一个某双流一大学通信与信息专业大二在读 brief 一直在算法竞赛学习的路上 copyright 2023 8 COPYRIGHT 原创技术
  • 数论——欧拉函数

    在数论中 对正整数n 欧拉函数是少于或等于n的数中与n互质的数的数目 此函数以其首名研究者欧拉命名 它又称为Euler s totient function 函数 欧拉商数等 例如 8 4 因为1 3 5 7均和8互质 百度百科词条 欧拉函
  • 给定一个字符串求出最长重复子串

    主要是使用到了二分的思想 知道字符串就是知道了它的长度 然后可知len max s length 2 然后暴力枚举就可以得出答案 代码如下 include
  • 迷宫 蓝桥杯 602

    题目描述 本题为填空题 只需要算出结果后 在代码中使用输出语句将所填结果输出即可 下图给出了一个迷宫的平面图 其中标记为 1 的为障碍 标记为 0 的为可以通行的地方 010000 000100 001001 110000 迷宫的入口为左上
  • 唯一分解定理(分解质因子)

    唯一分解定理 每个大于一的自然数均可写为质数的积 而且这些素因子按大小排列之后 写法只有一种方式 最简单的写法 include
  • 欧拉函数以及欧拉降幂

    大数幂运算指数太大的时候 我们需要进行降幂操作 首先呢 认识欧拉定理之前 先了解一下欧拉函数 欧拉函数性质 若p是一个质数 那么 p p 1 欧拉函数是积性函数 所以 nm n m 若n p k且p为质数 那么 n p k p k 1 证明
  • The 2019 ICPC Asia Yinchuan Regional Programming Contest/2019银川区域赛 D Easy Problem(莫比乌斯反演+欧拉降幂)

    题意 给你 n m d k n m d k n m d k计算下列式子
  • 第十届蓝桥杯省赛C++B组 迷宫

    试题 E 迷宫 本题总分 15 分 问题描述 下图给出了一个迷宫的平面图 其中标记为 1 的为障碍 标记为 0 的为可 以通行的地方 010000 000100 001001 110000 迷宫的入口为左上角 出口为右下角 在迷宫中 只能从
  • 奶酪【BFS】

    题目链接 点从z 0为起点 想跑到z h 只能在球内 或者是球表层上跑 问能否从起点跑到终点 直接暴力bfs判断即可 include
  • 仙岛求药 —— dfs 与 bfs求解

    样例输入1 8 8 样例输出1 10 样例输入2 9 6 样例输出2 1 dfs ps 使用dfs会运行超时 30组测试数据只能通过部分 其实这种最短路径 最少操作的问题最好还是靠bfs解决 import java util Scanner
  • How far away ? 【HDU - 2586】【DFS+链式前向星优化】

    题目链接 其实这道题可以不用链式前向星优化换做vector lt gt 也是可以跑的 只是会许会慢些而已 来换个中文题意好读些 勇气小镇是一个有着n个房屋的小镇 为什么把它叫做勇气小镇呢 这个故事就要从勇气小镇成立的那天说起了 修建小镇的时
  • Toyota Programming Contest 2023#8(AtCoder Beginner Contest 333)G. Nearest Fraction(有理实数求分母不超过n的最优逼近)

    题目 给一个不超过1的实数r r最多18位小数 和一个分母n n lt 1e10 求分母不超过n的与该有理实数的最优逼近 即二者绝对值之差最小 有理实数显然可以转成分数 思路来源 官方题解 farey序列论文 一类分数问题的研究 pdf 题

随机推荐

  • 最新整理CVPR、ICCV、ECCV会议及地点

    计算机视觉 Computer Vision CV 是人工智能领域的一个重要研究子领域 随着近年来CV学界研究成果在业界产生的巨大产业影响 计算机视觉受到越来越多的关注 同计算机其他研究领域一样 CV依然有着较浓厚的 会议情节 Compute
  • opencv 各版本 百度网盘

    V3 3 0 2017 9 9号更新 opencv 3 3 0 vc14 exe opencv 3 3 0 ios framework zip IOS opencv 3 3 0 zip Linux Mac opencv 3 3 0 andr
  • Wireshark抓取应用客户端通信域名及IP

    Wireshark是一款非常实用的网络封包分析软件 可简单理解为抓包软件 接下来就利用这款软件来抓取应用软件数据通信的域名及IP地址 一 Wireshark安装 下载地址 https www wireshark org download h
  • IT公司的吉祥“树” 二叉树-(堆)C语言创建

    目录 前言 一 树概念及结构 基本概念 树的专有名词 树的表示 孩子兄弟表示法 二 二叉树概念及结构 概念 现实中的二叉树 又称IT公司的吉祥物 特殊的二叉树 二叉树的性质 二叉树的存储结构 顺序存储 链式存储 三 堆 堆的概念及结构 概念
  • 【华为OD机试c++、python】服务中心选址【 2023 Q1考试题 A卷

    华为OD机试 题目列表 2023Q1 点这里 2023华为OD机试 刷题指南 点这里 题目描述 一家快递公司希望在一条街道建立新的服务中心 公司统计了该街道中所有区域在地图上的位置 并希望能够以此为依据为新的服务中心选址 使服务中心到所有区
  • 插入排序与Shell排序(图解+代码实例)

    排序算法在编写代码的过程当中应用十分广泛 作用非常重要 它的作用就是将一个排序混乱的序列按照一定的规则排列有序 下面一张图基本可以清晰的表示排序算法的分类 今天介绍的插入排序就是每一步都将一个待排数据按其大小插入到已经排序的数据中的适当位置
  • Linux主机与Windows虚拟机之间创建共享文件夹

    Linux主机与Windows虚拟机之间创建共享文件夹 概述 该篇博客是在Linux samba配置的基础上 进行Linux主机与Windows虚拟机之间配置共享文件夹的教程 该博客是在一次实际成功的配置基础上进行总结归纳 以便帮助其他人在
  • BasicDAO 和 SpringDAO的区别

    使用Hibernate生成Java类和映像文件时 可选择生成DAO 类 其中BasicDAO 和SpringDAO 的区别如下
  • 解决错误提示:“Flash Timeour Reset the Target and try it again“或者“Error: Flash Download failed - Cortex-M3

    今天来分享一下前几天在进行烧录时候遇到的一个错误 首先咱们来看一下这个错误提示的内容哈 错误提示 1 Flash Timeour Reset the Target and try it again 2 Error Flash Downloa
  • ctfshow web入门——web6

    解压源码到当前目录 测试正常 收工 访问 www zip 其中有一个fl000g txt 没有直接给flag 到网站上去访问这个文件 最终获得flag
  • 信捷plc编程100例梯形图_PLC梯形图编程基本规则

    由于梯形图是一种程序表示的形式 并非由硬件构成的控制电路 因此在画梯形图时 应注意和普通控制电路的不同之处 plc编程时应该遵循以下基本原则 1 外部输入 输出继电器 内部继电器 定时器 计数器等软器件的逻辑触点可以多次重复使用 无需用复杂
  • SpringBoot 整合QUARTZ 并嵌入可视化界面

    在开发中有很多定时任务都不是写死的而是可以人为配置并且写到数据库中的 下面简单的分享一个SpringBoot整合QUARTZ并嵌入可视化界面的demo Step1 在数据库中建立有关quartz的表 我用的是 mySql 数据库 建表语句如
  • Ubuntu19.04部署kubernetes-master⎈

    文章转载于 https blog csdn net qq 42346414 article details 89949380
  • 简单的js制作轮播图

    编辑html代码 使用数据存入图片 操作数据的下标 设定setInterval方法 每隔几秒执行一次 div class adver div
  • VMware Centos7 Mini 更改命令行界面文字及背景颜色

    进入命令行界面后 默认是白色字体 黑色界面 方法一 输入 setterm inversescreen on 后 会变成黑色字体 白色界面 其中 on 可以省略 如果要切换回白色字体 黑色界面 输入 setterm inversescreen
  • 哔哩哔哩电脑版怎么缓存视频?

    经常在B站上浏览视频的人 了解怎么缓存B站上的视频吗 小编在看B站视频时就找不到下载按钮 针对这个问题 专门去网上找了资料 下面就一起来看看缓存方法吧 哔哩哔哩电脑版缓存视频在哪里 答 哔哩哔哩电脑版无法缓存视频 只有手机版可以缓存视频 哔
  • 安卓APP_ 控件(9)—— PopupWindow弹窗

    摘自 安卓APP 控件 9 PopupWindow弹窗 作者 丶PURSUING 发布时间 2021 04 05 14 41 35 网址 https blog csdn net weixin 44742824 article details
  • UNITY笔记

    文章目录 常用API 将鼠标坐标系转换为Camera的坐标系 禁用碰撞体 按钮禁用 小Tip 数据存储的方法 解析Json 常用API 将鼠标坐标系转换为Camera的坐标系 Camera main ScreenToViewportPoin
  • 提示修复缺少D3DCompiler_47.dll文件的方法

    许多小伙伴下载游戏后 计算机提示缺乏D3DCompiler 47 dll文件 原因是计算机没有及时下载更新的文件 这也是无法加载游戏的原因 只要我们再下载一个 让我们看看具体的解决方案 1 先打开微软的网站 在搜索栏中输入 kb401990
  • 八数码问题【康托展开+BFS】

    Vijos 题库 八数码问题 背景 Yours和zero在研究A 启发式算法 拿到一道经典的A 问题 但是他们不会做 请你帮他们 描述 在3 3的棋盘上 摆有八个棋子 每个棋子上标有1至8的某一数字 棋盘中留有一个空格 空格用0来表示 空格