Eight II (HDU - 3567,BFS 打表 + 思维)

HDU(3567):八数码问题(升级版)——双BFS 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3567   有了HDU 1043的基础,此题就变得比较容易了,如果用A*算法,感觉路径不太好打印,所以就放弃了,看到有一种好像和1043一样的打表法,但是没怎么能理解,也就放弃了,虽然要打印最小字典序,单向BFS显然会TLE,所以我只能用双向BFS了。   好在,此题的输入保证有解,否则还得用一 阅读详情

一.题目链接:

HDU-3567

二.题目大意:

Eight 的升级版,游戏规则相同.

每次给出两个字符串 A, B,问 从 A 到 B 的最少步数 并 打印最小字典序的路径.

三.分析:

看了大神的分析才懂。。。

在这里阐述一下.

只考虑 X 的位置,由于 1 ~ 8 数字无特殊性

所以可将所给的 A 重新编号.

例如 A1:8 7 X 6 5 4 3  2 1

编号为 A2:1 2 X 3 4 5 6 7 8 

并使用相同的编号规则 给字符串 B 重新编号

这样 A2 -> B2 就等价与 A1-> B1.

又因为 X 的位置只有 9 种情况,所以可以先用 BFS 打表

之后重新编号 + 查询即可.

四.代码实现:

#include <set>
#include <map>
#include <ctime>
#include <queue>
#include <cmath>
#include <stack>
#include <vector>
#include <cstdio>
#include <sstream>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#define eps 1e-6
#define pi acos(-1.0)
#define ll long long int
using namespace std;

const int M = (int)5e5;

struct node
{
    int D[9];
    int x;
    int y;
};

bool vis[M + 5];
int fa[9][M + 5];
int inflection[9];
char dir[9][M + 5];

int Move[4][2] = {{1, 0}, {0, -1}, {0, 1}, {-1, 0}};

int cantor(struct node p)
{
    int sum = 0;
    int fac = 40320;
    for(int i = 0; i < 9; ++i)
    {
        int cnt = 0;
        for(int j = i + 1; j < 9; ++j)
        {
            if(p.D[j] < p.D[i])
                cnt++;
        }
        sum += fac * cnt;
        if(i == 8)
            return sum;
        fac /= 8 - i;
    }
}

void bfs(struct node p, int op)
{
    memset(vis, 0, sizeof(vis));
    struct node t;
    queue <node> q;
    int can1 = cantor(p);
    int can2;
    vis[can1] = 1;
    q.push(p);
    while(!q.empty())
    {
        p = q.front();
        q.pop();
        can1 = cantor(p);
        for(int i = 0; i < 4; ++i)
        {
            t = p;
            t.x += Move[i][0];
            t.y += Move[i][1];
            if(t.x < 0 || t.x >= 3 || t.y < 0 || t.y >= 3)
                continue;
            int pos = t.x * 3 + t.y;
            if(i == 0)
            {
                swap(t.D[pos], t.D[pos - 3]);
                can2 = cantor(t);
                if(!vis[can2])
                {
                    vis[can2] = 1;
                    dir[op][can2] = 'd';
                    fa[op][can2] = can1;
                    q.push(t);
                }
            }
            else if(i == 1)
            {
                swap(t.D[pos], t.D[pos + 1]);
                can2 = cantor(t);
                if(!vis[can2])
                {
                    vis[can2] = 1;
                    dir[op][can2] = 'l';
                    fa[op][can2] = can1;
                    q.push(t);
                }
            }
            else if(i == 2)
            {
                swap(t.D[pos], t.D[pos - 1]);
                can2 = cantor(t);
                if(!vis[can2])
                {
                    vis[can2] = 1;
                    dir[op][can2] = 'r';
                    fa[op][can2] = can1;
                    q.push(t);
                }
            }
            else if(i == 3)
            {
                swap(t.D[pos], t.D[pos + 3]);
                can2 = cantor(t);
                if(!vis[can2])
                {
                    vis[can2] = 1;
                    dir[op][can2] = 'u';
                    fa[op][can2] = can1;
                    q.push(t);
                }
            }
        }
    }
}

void init()
{
    struct node p, t;
    for(int i = 0; i < 9; ++i)
        p.D[i] = i + 1;
    for(int i = 0; i < 9; ++i)
    {
        t = p;
        t.D[i] = 0;
        t.x = i / 3;
        t.y = i % 3;
        bfs(t, i);
    }
}

 int read(struct node &p)
{
    int op;
    char ch;
    int pos = 0;
    while((ch = getchar()) != '\n')
    {
        if(ch == 'X')
        {
            op = pos;
            p.D[pos++] = 0;
        }
        else if(ch >= '1' && ch <= '8')
            p.D[pos++] = ch - '0';
    }
    return op;
}

int main()
{
    init();
    int T;
    scanf("%d", &T);
    getchar();
    for(int ca = 1; ca <= T; ++ca)
    {
        struct node p1, p2;
        int op = read(p1);
        read(p2);
        for(int i = 0; i < 9; ++i)
        {
            if(!p1.D[i])
                continue;
            inflection[p1.D[i]] = i + 1;
            p1.D[i] = i + 1;
        }
        for(int i = 0; i < 9; ++i)
        {
            if(!p2.D[i])
                continue;
            p2.D[i] = inflection[p2.D[i]];
        }
        int can1 = cantor(p1);
        int can2 = cantor(p2);
        stack <char> st;
        while(can1 != can2)
        {
            st.push(dir[op][can2]);
            can2 = fa[op][can2];
        }
        printf("Case %d: %d\n", ca, st.size());
        while(!st.empty())
        {
            printf("%c", st.top());
            st.pop();
        }
        printf("\n");
    }
    return 0;
}

 

HDU 3567 Eight II (八数码) 双向BFS 和 BFS打表 HDU 3567 Eight II (八数码) 双向BFS 和 BFS打表 八个数码八重境界,说的很有道理。你们要是有精力可以把所有的都试一下 我干不动了 到这里就退了哈哈哈。 如果没有做过1043的建议先去做一下1043. HDU1043 附上1043的题解1043题解 双向bfs: 话不多说了来看一下题意。和1043很像 如果没做过1043可以做一下。区别就是 1043更简单,1043说的... 阅读详情

相关推荐

unity转微信小游戏:UI大小设置

unity转微信小游戏:UI大小设置

会潜水的小火龙的博客 3273

hdu 3567 Eight II 八数码 双向BFS

代码:

冷月之殇 3390

erdas监督分类(二)

去云 用一张没有云的影像替代有云影像 构建aoi图层 将云和云影编码合并 重编码工作 在监督分类做的差不多以后(纠正无误,无明显错误),就要对监督分类图像进行重编码和颜色调整。 在中选中Recode,对原来分类的地物类别进行重编码,(为彻底修改,记得备份)选中一列,在New Value输入新的编码,依次编码后点击应用apply,即可实现。 这时的图像如果是全黑的或者只有一两类的颜色也没有关系,新的编码覆盖掉了原来的编码,但是颜色并没有改变才会这样。可以点击图像,右击...

weixin_58968530的博客 958

【HDU No. 3567】八数码 II Eight II

【HDU No. 3567】八数码 II Eight II

代码改变世界 737

YOLO11涨点优化:注意力魔改 | 新颖的多尺度卷积注意力(MSCA),即插即用,助力小目标检测

多尺度卷积注意力(MSCA),有效地提取上下文信息,新颖度高,创新十足。

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 6317

利用 Python 构建高效爬虫爬取国家标准文献——从基础到进阶

然而,由于许多标准文献需要从特定网站获取,手动下载既耗时又低效,因此构建自动化爬虫成为一种实用且高效的解决方案。本文从技术选型、网站分析、代码实现到反爬优化,全面讲解了如何爬取国家标准文献。国家标准文献(National Standards Literature)是国家对各领域统一规范的文件,涵盖了技术参数、测试方法、生产工艺等内容。因此,通过自动化爬虫技术进行文献爬取和管理,不仅能解放劳动力,还可以提高数据管理效率。在构建爬虫前,我们需要对目标网站进行分析,包括页面结构、请求方式以及可能的反爬机制。

2201_76125261的博客 2105

hdu 3567(八码数 + 双向bfs)

题目连接:https://vjudge.net/contest/353606#problem/B 参考文章:https://blog.youkuaiyun.com/laaahu/article/details/96648344 思路: 广搜,记录路径,因为最多的交换次数不会太多,所以可以用int类型的4进制数记录路径;因为要求字典序最小,所以走得方向是dlru,当每次找到合法的路径时判断是否是字典...

积少成多,水滴石穿 658

从业务角色到工作台:一步步创建 SAP Fiori Launchpad Space 与 Page

SAP S/4HANA Launchpad 配置优化指南:从业务角色出发构建高效工作台 本文针对S/4HANA项目中用户普遍反映的"入口难找"问题,提出基于Spaces和Pages的系统化解决方案。通过"以工作岗位为中心"的设计理念,将Launchpad信息架构重构为:一个业务角色对应一个Space,每个Space包含1-5个Page,Page内按任务划分2-5个Section,每个Section放置3-7个Tiles。文章详细阐述了从Business Role入手配

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 228

【kuangbin带你飞--进阶搜索专题】Eight II

Eight-puzzle, which is also called "Nine grids", comes from an old game. In this game, you are given a 3 by 3 board and 8 tiles. The tiles are numbered from 1 to 8 and each covers a grid. As you see,...

qq_42711300的博客 284

告别 DIFY 构建卡顿 / 失败!巧用 Makefile 一键构建本地 WEB 镜像,附核心避坑指南

本文详细介绍了DIFY本地源码构建WEB镜像的完整流程,重点解决因官方npm源不稳定导致的构建失败问题。通过修改web/Dockerfile文件启用国内npmmirror镜像源,可大幅提升依赖下载速度和稳定性。在DIFY根目录执行封装好的make build-web命令即可一键完成构建,无需手动编写复杂docker命令。文章还提供了前置环境准备、构建结果验证等实用指导,帮助开发者高效完成DIFY前端二次开发后的镜像构建验证。

2501_93651177的博客 182

基于Python的IMF经济数据爬取与分析:从入门到实战

本文详细介绍了如何使用Python爬取国际货币基金组织(IMF)的经济数据,包括最新的爬虫技术、反反爬策略、数据解析与存储方法。文章从IMF数据源分析开始,逐步讲解如何构建一个完整的爬虫系统,并提供了详细的代码实现和优化建议。通过本文,读者将掌握爬取复杂国际组织数据的关键技术,并能将这些技术应用于其他类似的数据获取场景。关键词:Python爬虫、IMF数据、经济数据获取、数据清洗、反爬策略IMF Data (data.imf.org) - 主要数据门户。

2201_76125261的博客 1439

HDU 3567 Eight II(BFS打表)

题目大意   还是八数码问题,输入起始结束状态,输出最小字典序的操作顺序 思路   还是用BFS打表,为了使操作最短,处理出X在不同位置不断操作能达到的各种状态,至于为什么根据X的不同处理,除了X外,其他数字可以随意替换,如: 1 2 3      3 4 5 4 5 6   =>  7 8 X 7 8 X      6 2 1 可以替换成 a b c      c d e d e f   ...

IuSpet的博客 323

ISO2626 --- Item Definition相关项定义

本文并不是针对ISO26262的一个项目,而是针对ISO26262的规范,我们在相关项定义阶段,我们需要做什么,我们的文档需要包含哪些内容的一个描述。

wj博客 909

HDU 3567 Eight II (BFS+映射+康托展开)

题面 Eight-puzzle, which is also called "Nine grids", comes from an old game. In this game, you are given a 3 by 3 board and 8 tiles. The tiles are numbered from 1 to 8 and each covers a grid. As you s...

Yi_Qing_Z的博客 1028

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

HDU 3567 Eight II 预处理+bfs+hash

传送门:HDU3567 题意:经典八数码问题,将八数码从状态A转化到状态B,问最短且字典序最小的解法。 思路:先说说我自己吧,我是刚做完了POJ1077就来做这个题,当时感觉这不是一样的么,改个bfs结束条件不就完事了,然后就一发wa。。看题解才发现A*算法不能保证输出结果是字典序最小的,仔细想想,好像确实是,因为A*中F=G+H的等式是为了更快的求得解,我们每次从优先队列中取出来的状态是F值

WA是一笔财富 1287

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

【双向BFS搜索】hdu3567Eight II

http://acm.hdu.edu.cn/showproblem.php?pid=3567 题目大意:8数码问题。给定起始状态和目标状态,求最少移动次数和字典序最小的方案。(r:向右,l:向左,u:向上,d:向下)用单向BFS–>无限TLE 可以用双向BFS和A∗A^*搜索,但注意由于要求字典序最小,无论是双向BFS,还是A∗A^*搜索都无法保证最先出现的解字典序最小。无奈只得将最小移动次数全

蒟蒻的奋斗史 1054

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

HDU3567(Eight II)

Eight II 题目传送门 Problem Description Eight-puzzle, which is also called “Nine grids”, comes from an old game. In this game, you are given a 3 by 3 board and 8 tiles. The tiles are numbered from 1 to 8 and each covers a grid. As you see, there is a blank grid

weixin_43808717的博客 285

Eight II HDU - 3567写题报告

题目链接 原题链接 难度分析 这题啊,这题也不是很难,总的来说就是:思维+bfs逆向路径打印+打表+康托展开 我花了两天,tle四次,mle4次然后就写出来的。写完以后神清气爽,就想说一句我(w)带(d)你(n)们(m)打(d)icpc。 题解 由于每次都是改变x的位置,而x只可能出现在方块的9个位置中,所以可以根据x的位置进行分类,,然后别打表,然后再进行映射处理,得到答案。 具体来说,就是分别以 12345678x 1234567x8 123456x78 12345x678 1234x5678 123

SCUEC__zhazhahui的博客 273

HDU - 3567 Eight II 【bfs打表+映射+康托展开】

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3567 这道题比较容易想到的就是双向bfs,在时间上是比较理想的,但是在内存上就比较紧张。 网上看到有人用映射的技巧做这题。 假设我知道起点是 12345678x这个状态到其他状态的所有路径。对于所有起点是 ********x这个状态到其他状态的所有路径我也能够知道。 假设我知道12x34567...

Y390d的博客 358

HDU 3567 Eight II 八数码(2)

转载请注明出处,谢谢 http://blog.youkuaiyun.com/ACM_cxlove?viewmode=contents           by---cxlove 八数码的升级版,给定起点,终点,双向BFS可破。有了魔板那题的基础。 同样对这题进行预处理,不过需要注意的是,这题有不同的情况,也就是空位X造成的,所以枚举X的位置,9种置换,进行BFS。 对于每一种起点,保存所有的能到达状

窝不是爱酱,喵~~~~ 2450

HDU-3567 Eight II

八数码问题,给出初始状态和结束状态,要输出最短移动路径中字典序最小的那个,输入保证有解因为数据量比较多,不能单纯的BFS,双向BFS也不能保证字典序,这里利用了映射的思想以及打表先以X12345678,1X2345678.....,1234567X8,12345678X为开始进行BFS,把路径分开保存好然后将起始状态映射为以上其中的一个(X的位置一样的那个),相应的把结束状态转变过去,再寻找路径回...

wl16wzl的博客 319

B - Eight II HDU - 3567(bfs+预处理)

B - Eight II HDU - 3567 思路 这一题由于是多组输入,如果我们对每一组输入都进行一遍 bfs 这样肯定会T, 那么这一题的,奇妙思路就是预处理所有可能产生的终点状态,进行bfs逆向bfs 我们假设所以的逆向状态为: “X12345678”, “1X2345678”, “12X345678”, “123X45678”, “1234X5678”, “12345X678”, “123456X78”, “1234567X8”, “12345678X”, 对于题目的中给我两个 起始、终

做一只熊猫不好吗? 315

HDU 3567 Eight II

//HDU 3567 Eight II //Eight的进阶版 //1.划归思想,将所有问题归为九种以X的位置进行讨论 //2.路径的记录与每个节点的特殊标记关联,该题便通过vis[][]起到记录路径的作用 //3.有顺序的广搜 //4.康托展开hash构造 #include<bits/stdc++.h> using namespace std; const int maxn = 4e5; //大于9! const int fac[10]={1,1,2,6,24,120,720,5040,

qq_46194023的博客 198

HDU 3567 Eight II(八数码 II)

HDU 3567 Eight II(八数码 II) TimeLimit:4000/2000MS(Java/Others)MemoryLimit:130000/65536K(Java/Others) ProblemDescription - 题目描述   Eight-puzzle, which is also called "Nine ...

352

HDU3567:Eight II(康拓展开+预处理)

Problem Description Eight-puzzle, which is also called "Nine grids", comes from an old game.  In this game, you are given a 3 by 3 board and 8 tiles. The tiles are numbered from 1 to 8 and each

ACM!荣耀之路! 4944
上一篇: Eight (HDU - 1043,反向 BFS + 康拓展开)
下一篇: Escape (HDU - 3533,BFS + 模拟)
The___Flash
博客等级 码龄8年 79粉丝 223原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值