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

news2024/11/15 23:50:07

在这里插入图片描述
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;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《WebKit 技术内幕》学习之十三(1):移动WebKit

1 触控和手势事件 1.1 HTML5规范 随着电容屏幕的流行&#xff0c;触控操作变得前所未有的流行起来。时至今日&#xff0c;带有多点触控功能已经成为了移动设备的标准配置&#xff0c;基于触控的手势识别技术也获得巨大的发展&#xff0c;如使用两个手指来缩放应用的大小等。…

【多线程】ThreadLocal 详解,举例说明

不理解多线程的同学可先了解多线程理论篇【多线程】线程是什么&#xff1f;多线程为什么&#xff1f;怎么做&#xff1f;通俗易懂讲解多线程 以及多线程进阶篇【多线程】多线程安全&#xff0c;为什么不安全&#xff0c;要怎么做保证其安全&#xff0c;实例 1、ThreadLocal是什…

快速入门Playwright框架:从零到自动化测试的第一步

Playwright框架&#xff1a; 背景介绍&#xff1a; ​ Playwright 是微软开发的 Web应用 的 自动化测试框架 。selenium相对于Playwright慢很多&#xff0c;因为Playwright是异步实现的&#xff0c;但是selenium是同步的&#xff0c;就是后一个操作必须等待前一个操作。 sel…

Python添加、修改和删除列表元素

Python 是一种简洁而强大的编程语言&#xff0c;广泛用于不同领域的软件开发和数据分析中。在 Python 中&#xff0c;列表&#xff08;List&#xff09;是一种非常常用的数据类型&#xff0c;用于存储一组元素并按顺序访问。本文将讨论如何在 Python 中对列表进行添加、修改和删…

[极客大挑战 2019]Upload1

直接上传php一句话木马&#xff0c;提示要上传image 把文件名改成gif并加上gif文件头后&#xff0c;绕过了对image类型的检测&#xff0c;但是提示文件内含有<?&#xff0c;且bp抓包后改回php也会被检测 那我们考虑使用js执行php代码 <script languagephp>eval($_PO…

mysql生成最近24小时整点最近30天最近12个月时间临时表

文章目录 生成最近24小时整点生成最近30天生成最近12个月 在统计的时候需要按时间来展示&#xff0c;但是数据的时间不一定是连续的&#xff0c;那就需要在代码里面生成连续的时间&#xff0c;然后按时间匹配到对应的数据&#xff0c;这样比较麻烦&#xff0c;可以在sql中使用连…

Transfomer相关最新研究

文章目录 LogTrans * (有代码&#xff09;TFT &#xff08;有代码&#xff09;InfluTran &#xff08;有代码&#xff09;Informer *&#xff08;有代码&#xff09;&#xff08;长时间&#xff09;ProTranAutoformer ***&#xff08;有代码&#xff09;AliformerPyraformer &a…

[蓝桥学习] 前缀和与差分

前缀和原理 特点 求区间和 如果要实现一边修改一边查询&#xff0c;需要使用树状树组和线段树。 例题 题目很简单&#xff0c;但是代码实现惊艳到我了&#xff0c;是L就加1&#xff0c;是Q就减1&#xff0c;如果区间 [i,j] 是平衡子串的话&#xff0c;那它会在前缀prefix i …

自己本机Video retalking制作数字人

首先需要注意的是&#xff0c;这个要求你的笔记本显存和内存都比较大。我的电脑内存是64G&#xff0c;显卡是8G&#xff0c;操作系统是Windows 11&#xff0c;勉强能够运行出来&#xff0c;但是效果不是很好。 效果如下&#xff0c;无法上传视频&#xff0c;只能通过图片展示出…

C++是如何发展起来的?如何学习C++呢?

一、什么是C C语言是结构化和模块化的语言&#xff0c;适合处理较小规模的程序。对于复杂的问题&#xff0c;规模较大的程序&#xff0c;需要高度的抽象和建模时&#xff0c;C语言则不合适。为了解决软件危机&#xff0c; 20世纪80年代&#xff0c; 计算机界提出了OOP(object …

YOLO 自己训练一个模型

一、准备数据集 我的版本是yolov8 8.11 这个目录结构很重要 ultralytics-main | datasets|coco|train|val 二、训练 编写yaml 文件 # Train/val/test sets as 1) dir: path/to/imgs, 2) file: path/to/imgs.txt, or 3) list: [path/to/imgs1, path/to/imgs2, ..] path…

(超全七大错误)Invalid bound statement (not found): com.xxx.dao.xxxDao.add

1.确保你把dao和mapper都在applicationContext.xml中都扫描了 xml文件 <bean id"sqlSessionFactory" class"org.mybatis.spring.SqlSessionFactoryBean"><property name"dataSource" ref"dataSource"/><property nam…

机器学习算法(一)

一、线性回归 线性回归&#xff08;Linear Regression&#xff09;可能是最流行的机器学习算法。线性回归就是要找一条直线&#xff0c;并且让这条直线尽可能地拟合散点图中的数据点。它试图通过将直线方程与该数据拟合来表示自变量&#xff08;x 值&#xff09;和数值结果&am…

sql管理工具archery简介

在平时的工作过程中&#xff0c;我们肯定会遇到使用sql平台的场景&#xff0c;业内也有很多工具&#xff0c;类似阿里云的dms&#xff0c;但是这个是和云厂商绑定的&#xff0c;我们可能一般没有用到阿里云组件就比较困难了&#xff0c;那还有什么选项了&#xff0c;经过调研&a…

自学C语言-6

第6章 选择结构程序设计 顺序结构程序设计最简单&#xff0c;但通常无法解决生活中的选择性问题。选择结构程序设计需要用到一些条件判断语句&#xff0c;可实现的程序功能更加复杂&#xff0c;程序的逻辑性与灵活性也更加强大。 本章致力于使读者掌握使用if语句进行条件判断的…

14.点亮 LED 灯

14.点亮 LED 灯 1. 应用层操控硬件的两种方式1.1 sysfs 文件系统1.2 sysfs 与 /sys1.3 总结 2. LED 硬件控制方式3. 编写 LED 应用程序4. 在开发板上测试 1. 应用层操控硬件的两种方式 应用层如何操控底层硬件&#xff0c;同样也是通过文件 I/O 的方式来实现&#xff0c;设备文…

python基础——锁

进程锁 (互斥锁) 进程锁的引入&#xff1a; 模拟抢票程序&#xff1a; from multiprocessing import Process import json import time def show_ticket(i):with open("./tickets.txt",mode"r",encoding"utf-8") as file:ticket json.load(f…

2024.1.22力扣每日一题——最大交换

2024.1.22 题目来源我的题解方法一 暴力法方法一 哈希表贪心方法三 贪心 题目来源 力扣每日一题&#xff1b;题序&#xff1a;670 我的题解 方法一 暴力法 直接暴力对数字中的每两个位置进行交换&#xff0c;然后记录交换后生成数字的最大值 时间复杂度&#xff1a;O( log ⁡…

下拉回显问题案例大全

下拉回显问题案例大全 一、原生js案例 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>下拉框数据回…

13. 高级IO

13. 高级IO 1. 非阻塞 IO1.1 阻塞 IO 与非阻塞 IO 读文件 2. IO 多路复用2.1 何为 IO 多路复用2.2 select()2.3 poll()2.3.1 struct pollfd2.3.2 poll() 返回值2.3.3 示例 3. 异步 IO3.1 O_ASYNC3.2 设置异步 IO 事件的接收进程3.3 示例 4. 优化异步 IO4.1 使用实时信号替换默认…