hdu1195 Open the lock 双向广度优先搜索

在这里插入图片描述
D-BFS 双向广度优先搜索
从起点和终点同时开始搜索,直到两个搜索的点相交,得到最短路径
Code:

// D-BFS
//by:MuQY
#include <iostream>
#include <algorithm>
#include <string.h>
#include <queue>
#include <string>
using namespace std;
int stmap[10005]; // 标记每一个情况下走了几步
int vis[10005];   // 标记每个情况下有没有被访问过,是正向还是逆向
string s, e;
struct Node
{
    int num[4];
    int step;
};
queue<Node> q, p; // q从s开始,p从e开始
int get_Num(int c[])
{
    int tmp = 0;
    for (int i = 0; i < 4; i++)
    {
        tmp *= 10;
        tmp += c[i];
    }
    return tmp;
}
void bfs()
{
    memset(vis, 0, sizeof(vis));
    memset(stmap, 0, sizeof(stmap));
    Node a, b;
    int tmp;
    while (!q.empty() || !p.empty())
    {
        if (!q.empty()){
            a = q.front();
            q.pop();
            for (int i = 0; i < 4; i++){
                b = a;
                b.num[i] = a.num[i] + 1;//+1
                if(b.num[i] == 10){
                    b.num[i] = 1;
                }
                tmp = get_Num(b.num);
                if(vis[tmp] == 0){//没有出现过
                    b.step = a.step + 1;
                    stmap[tmp] = b.step;
                    vis[tmp] = 1;
                    q.push(b);
                }
                else if(vis[tmp] == 2){//有交点
                    cout << a.step + stmap[tmp] + 1;
                    return;
                }
                b.num[i] = a.num[i] - 1; //-1
                if(b.num[i] == 0){
                    b.num[i] = 9;
                }
                tmp = get_Num(b.num);
                if (vis[tmp] == 0)
                { // 没有出现过
                    b.step = a.step + 1;
                    stmap[tmp] = b.step;
                    vis[tmp] = 1;
                    q.push(b);
                }
                else if (vis[tmp] == 2)
                { // 有交点
                    cout << a.step + stmap[tmp] + 1 << endl;
                    return;
                }
            }
            for (int i = 0; i < 3; i++){//交换相邻数字
                b = a;
                swap(b.num[i], b.num[i + 1]);
                tmp = get_Num(b.num);
                if(vis[tmp] == 0){
                    b.step = a.step + 1;
                    stmap[tmp] = b.step;
                    vis[tmp] = 1;
                    q.push(b);
                }
                else if(vis[tmp] == 2){
                    cout << a.step + stmap[tmp] + 1 << endl;
                    return;
                }
            }
        }
        if(!p.empty()){
            a = p.front();
            p.pop();
            for (int i = 0; i < 4; i++)
            {
                b = a;
                b.num[i] = a.num[i] + 1; //+1
                if (b.num[i] == 10)
                {
                    b.num[i] = 1;
                }
                tmp = get_Num(b.num);
                if (vis[tmp] == 0)
                { // 没有出现过
                    b.step = a.step + 1;
                    stmap[tmp] = b.step;
                    vis[tmp] = 2;
                    p.push(b);
                }
                else if (vis[tmp] == 1)
                { // 有交点
                    cout << a.step + stmap[tmp] + 1 << endl;
                    return;
                }
                b.num[i] = a.num[i] - 1; //-1
                if (b.num[i] == 0)
                {
                    b.num[i] = 9;
                }
                tmp = get_Num(b.num);
                if (vis[tmp] == 0)
                { // 没有出现过
                    b.step = a.step + 1;
                    stmap[tmp] = b.step;
                    vis[tmp] = 2;
                    p.push(b);
                }
                else if (vis[tmp] == 1)
                { // 有交点
                    cout << a.step + stmap[tmp] + 1 << endl;
                    return;
                }
            }
            for (int i = 0; i < 3; i++)
            { // 交换相邻数字
                b = a;
                swap(b.num[i], b.num[i + 1]);
                tmp = get_Num(b.num);
                if (vis[tmp] == 0)
                {
                    b.step = a.step + 1;
                    stmap[tmp] = b.step;
                    vis[tmp] = 2;
                    p.push(b);
                }
                else if (vis[tmp] == 1)
                {
                    cout << a.step + stmap[tmp] + 1 << endl;
                    return;
                }
            }
        }
    }
}

int main()
{
    int tcase;
    cin >> tcase;
    while (tcase--)
    {
        while(!q.empty()){
            q.pop();
        }
        while(!p.empty()){
            p.pop();
        }
        Node ss, ee;
        int s_num, e_num;
        memset(stmap, 0, sizeof(stmap));
        memset(vis, 0, sizeof(vis));
        cin >> s >> e;
        for (int i = 0; i < 4; i++)
        {
            ss.num[i] = s[i] - '0';
            ee.num[i] = e[i] - '0';
        }
        s_num = get_Num(ss.num);
        e_num = get_Num(ee.num);
        ss.step = 0;
        ee.step = 0;
        vis[s_num] = 1;
        vis[e_num] = 2;
        q.push(ss);
        p.push(ee);
        bfs();
    }
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/348360.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

redis + 拦截器 :防止数据重复提交

1.项目用到,不是核心 我们干系统开发,不免要考虑一个点&#xff0c;数据的重复提交。 我想我们之前如果要校验数据重复提交要求&#xff0c;会怎么干?会在业务层&#xff0c;对数据库操作&#xff0c;查询数据是否存在,存在就禁止插入数据; 但是吧,我们每次crud操作都会连接…

Conda 使用environment.yml创建一个新的Python项目

Conda系列&#xff1a; 翻译: Anaconda 与 miniconda的区别Miniconda介绍以及安装Conda python运行的包和环境管理 入门Conda python管理环境environments 一 从入门到精通Conda python管理环境environments 二 从入门到精通Conda python管理环境environments 三 从入门到精通…

luceda ipkiss教程 58:输出器件的版图和三维模型

在ipkiss中&#xff0c;通过visualize_3d_povray可以输出包含器件的三维模型参数的.pov文件&#xff0c;再通过POV-Ray&#xff08;免费软件&#xff0c;下载地址&#xff1a;https://www.povray.org/download/&#xff09;就可以查看器件的三维模型。 如&#xff1a; 代码如…

账号定位基础

1.账号定位流程 定位体系 &#xff08;1&#xff09;商业定位 ①商业定位-带货 ②商业定位-引流 ③商业定位-接广告 ④商业定位-直播打赏 &#xff08;2&#xff09;内容定位 内容定位分为&#xff1a;主题IP、人物IP &#xff08;2-1&#xff09;主题IP ①有用处 ②有兴…

144基于matlab的平面桁架结构的总体刚度矩阵计算

基于matlab的平面桁架结构的总体刚度矩阵计算&#xff0c;最后以图形形式显示出桁架结构&#xff0c;程序已调通&#xff0c;可直接运行。 144matlab 平面桁架 有限元分析 总体刚度 (xiaohongshu.com)

0125-2-Vue深入学习1—mustache模板引擎原理

[mustache] 是 “胡子”的意思&#xff0c;因为它的嵌入标记 {{ }} 旋转过来很像[胡子]&#xff0c;Vue中的 {{ }} 语法也引用了mustache&#xff0c;这也是我深入学习的目的。 1、原始js方式使 数据 变为视图 <ul id"list"></ul><script>var arr …

Git常用命令介绍

Git 是一个开源的分布式版本控制系统&#xff0c;用于敏捷高效地处理任何或小或大的项目 一、Git的安装 安装包下载地址&#xff1a;https://gitforwindows.org/ 国内的镜像地址&#xff1a;https://npm.taobao.org/mirrors/git-for-windows/ 完成安装之后&#xff0c;在开…

面试常问的Spring AOP底层原理

AOP底层原理可以划分成四个阶段&#xff1a;创建代理对象阶段、拦截目标对象阶段、调用代理对象阶段、调用目标对象阶段 第一阶段&#xff1a;创建代理对象阶段 通过getBean&#xff08;&#xff09;方法创建Bean实例根据AOP的配置匹配目标类的类名&#xff0c;判断是否满足切…

wfuzz网站模糊测试

https://github.com/xmendez/wfuzz Wfuzz: The Web fuzzer — Wfuzz 2.1.4 documentatio n 一、wfuzz介绍 WFuzz是基于Python开发的 Web安全模糊测试工具。可以将其理解为Fuzz一款暴力破解工具。根据用户提供的字典&#xff0c;获取web站点的敏感目录和信息。 Wfuzz 提供了一个…

小程序样例3:根据日历创建待办事项

基本功能 1、待办事项查看 选择不同的日期显示不同的待办: 2、选择日期后 新增事项&#xff1a; 3. 点击事项&#xff0c;查看详情 4、删除事项&#xff1a;删除事项3之后&#xff0c;剩余事项2 5、点击日期可以选择更多的月&#xff1a; 实现思路&#xff1a; 1、数据结构&a…

开始学习Vue2(axios和Vuex)

一、Axios 1、Axios 简介 Axios 是一个基于 promise 网络请求库 &#xff0c;作用于node.j s 和浏 览器中。它是 isomorphic 的(即同一套代码可以运行在浏览器 和 node.js 中)。在服务端它使用原生 node.js http 模块, 而在 客户端 (浏览端) 则使用 XMLHttpRequests。 …

通俗易懂理解SegNet语义分割模型

重要说明&#xff1a;本文从网上资料整理而来&#xff0c;仅记录博主学习相关知识点的过程&#xff0c;侵删。 一、参考资料 深度学习之图像分割—— SegNet基本思想和网络结构以及论文补充 一文带你读懂 SegNet&#xff08;语义分割&#xff09; 二、相关介绍 1. 上采样(…

关于爬虫爬取网页时遇到的乱码问题的解决方案。

目录 前言解决措施 前言 最近&#xff0c;我像爬取一下三国演义这本书籍的全部内容。 网站的网址为&#xff1a;https://www.shicimingju.com/book/sanguoyanyi.html 但是我爬取出来的结果是这样的 会遇到乱码。 经过我多方面的调试发现&#xff0c;就是网页的编码和我pycha…

mysql8版本批量造4000个数据SQL

需求&#xff1a; 测试工作中修改单需要构造单元下4000个组合的数据&#xff0c;写个博客来记录&#xff0c;其他类似的可以举一反三。 具体sql&#xff1a; 实现1个产品1个单元下插入4000个组合数据 思路&#xff1a; 在MySQL 8中实现循环插入4000条具有不同主键的记录&a…

jquery多选框

使用hbuilder <!DOCTYPE html> <html><head><meta charset"GBK"><title></title></head><body><table id"myTable"> <tr> <td>黄1</td> </tr> <tr> <td>…

echarts 玫瑰饼图 俩个共用一个图例 可同时改变

export const getRosePie (option {}) > {return {legend: {textStyle: {color: #B0D0E9}},tooltip: {},dataset: {// source: [// [flag, 已解决, 未解决],// [设备告警, 86, 10],// [环境告警, 41, 30],// [任务告警, 24, 67]// ]source: option.source},series…

【Web前端实操15】利用Grid布局完成九宫格

相关知识点&#xff1a; 创建多列 column-count 属性指定了需要分割的列数 列与列之间的间隙 column-gap 属性指定了列与列间的间隙 列边框 column-rule-style 属性指定了列与列间的边框样式 column-rule-width 属性指定了两列的边框厚度 column-rule-color 属性指定了…

如何在 Kotlin Multiplatform 库的 API 中避免请求 Android Context

如何在 Kotlin Multiplatform 库的 API 中避免请求 Android Context 假设你正在进行 Kotlin Multiplatform 项目的开发。 你需要从通用代码中获取用户的 GPS 位置&#xff0c;并且目前没有现成的库可以实现该功能。 这时&#xff0c;你决定编写一个新的 Kotlin Multiplatform …

数据结构——静态链表

1.定义&#xff1a; &#xff08;1&#xff09;单链表&#xff1a;各个结点散落在内存中的各个角落&#xff0c;每个结点有指向下一个节点的指针(下一个结点在内存 中的地址); &#xff08;2&#xff09;静态链表&#xff1a;用数组的方式来描述线性表的链式存储结构: 分配一…

Windows中Zookeeper与kafka的安装配置

一、Zookeeper安装与使用 1.安装包下载 直接在官网下载即可Apache ZooKeeper。 下载后直接解压到本地即可。 2.环境配置 1> 在目录中下增加data和log文件夹 2> 解压目录下的 conf 目录&#xff0c;将目录中的 zoo_sample.cfg 文件&#xff0c;复制一份&#xff0c;重…