首页 星云 工具 资源 星选 资讯 热门工具
:

PDF转图片 完全免费 小红书视频下载 无水印 抖音视频下载 无水印 数字星空

剪枝的应用,bfs判重 蚱蜢跳——蓝桥p642

编程知识
2024年09月27日 17:38

问题描述

总共有九个盘子,八只蚱蜢,且每个盘子中只能容下一只蚱蜢,蚱蜢的编号为1~8,如果蚱蜢所在的盘子紧邻着空盘子,那么该蚱蜢可以从自己的盘子跳到空盘子中,也可以隔一个盘子跳到空盘子中,问一开始状态是012345678,蚱蜢至少该跳多少步才可以被变为087654321

输入

输出

蚱蜢跳过的步数

问题分析:

  • 题目中说的是蚱蜢在跳,但蚱蜢有很多只,这会增加编码难度,但空盘子只有一个,我们可以让盘子移动,你那么就可以规避这个问题
  • 经过分析,盘子的移动方式有四种,左1,左2,右1,右2,但由于题目中这些盘子是一个圈,所以在移动时也要考虑这一因素,也就时我们常说的化曲为直,多提一句,这个移动其实是有公式的但是我不大像推,所以就用了switch语句,效果是一样的
  • 之后就是本题的核心-————去重,这里我使用的时map,其实还有set,去重操作可以帮助删去大量的重复节点
#include<iostream>
#include<map>
#include<queue>
using namespace std;

struct node {
    node(){}
    node(string ss, int tt,int po) :s(ss),t(tt),pos(po){}
    string s;
    int t;   //表示步数
    int pos;  //表示当前字符串0的位置,从0开始数
};

map<string, bool>mp;
queue<node>que;

node now, nxt;

int cal(int i,int pos) {
    switch (i) {
    case 1:
        return pos + 1 > 8 ? pos+1-8-1 : pos + 1;
        break;
    case 2:
        return pos + 2 > 8 ? pos+2-8-1 : pos + 2;
        break;
    case 3:
        return pos - 1 < 0 ? pos-1+8+1 : pos - 1;
        break;
    case 4:
        return pos - 2 < 0 ? pos-2+8+1 : pos - 2;
    }
}

void bfs() {
    while (!que.empty()) {
        now = que.front();
        que.pop();
        //如果找到答案就结束循环
        if (now.s == "087654321") {
            cout << now.t << endl;
            break;
        }
        for (int i = 1; i <= 4; i++) {
            int k = cal(i, now.pos);
            nxt.pos = k;
            nxt.s = now.s;
            nxt.t = now.t + 1;
            char tmp = nxt.s[now.pos];
            nxt.s[now.pos] = nxt.s[k];
            nxt.s[k] = tmp;
            //map判重
            if (!mp[nxt.s]) {
                mp[nxt.s] = true;
                que.push(nxt);
            }
        }
    }
}

int main() {
    string s = "012345678";
    que.push(node(s, 0, 0));
    mp[s] = true;
    bfs();
    return 0;
}
From:https://www.cnblogs.com/oQAQo/p/18432720
本文地址: http://www.shuzixingkong.net/article/2357
0评论
提交 加载更多评论
其他文章 C#爬取动态网页上的信息:B站主页
目录简介获取 HTML 文档解析 HTML 文档测试参考文章 简介 动态内容网站使用 JavaScript 脚本动态检索和渲染数据,爬取信息时需要模拟浏览器行为,否则获取到的源码基本是空的。爬取步骤如下: 使用 Selenium 获取渲染后的 HTML 文档 使用 HtmlAgilityPack 解
C#爬取动态网页上的信息:B站主页
JS数据类型&类型转换
基本数据类型 JS中的数据类型由原始值和对象共同组成,原始值一共有七种原始值: 数值(Number) 大整数(BigInt) 字符串(String) 布尔值(Boolean) 空值(Null) 未定义(Undefined) 符号(Symbol) 数值和大整数 数值(Number):在js中所有的整数
JS数据类型&类型转换 JS数据类型&类型转换
Serilog文档翻译系列(六) - 可用的接收器、增强器、格式化输出
Serilog支持多种接收器用于日志存储,增强器用于添加属性,LogContext管理动态属性,支持多种输出格式包括纯文本、JSON及ExpressionTemplate。还提供了自定义格式化选项,适用于不同需求。
Serilog文档翻译系列(六) - 可用的接收器、增强器、格式化输出
命令行gcc -v和g++ -v输出版本不一致
命令行gcc -v和g++ -v输出版本不一致 前言:本文初编辑于2024年1月30日 CSDN主页:https://blog.csdn.net/rvdgdsva 博客园主页:https://www.cnblogs.com/hassle 赞美大萌神,神不允许报错,这世上就没有了bug 本人错误描述:
命令行gcc -v和g++ -v输出版本不一致
反问面试官:如何实现集群内选主
这个示例展示了多个节点通过投票选举一个新的主节点的过程。Netty 用于节点间的通信,而每个节点则负责发起和响应选举消息。
反问面试官:如何实现集群内选主 反问面试官:如何实现集群内选主
Linux 防火墙与安全管理工具详解
Linux 防火墙与安全管理工具详解 1. Iptables 概述 Iptables 是 Linux 系统中用于控制网络流量的工具,通过定义规则来过滤、转发和修改数据包。其规则可以细致地管理进入和离开系统的数据流。 1.1 三表五链 1.1.1 三表 Iptables 中主要有三种表,每种表用于不同
Linux 防火墙与安全管理工具详解
《华为云DTSE》期刊免费下载:10个案例读懂云上架构升级策略
本文分享自华为云社区《《华为云DTSE》期刊第四期赋能云专刊,赋能云场景下DTSE服务各类开发者的案例分享》,作者:HuaweiCloudDeveloper。 把公司的开发者平台统一在一起,是华为云所担负的任务,其最终目的是要汇聚开发者、做厚“黑土地”,支撑三大根生态的发展壮大。这也意味着,作为支撑
《华为云DTSE》期刊免费下载:10个案例读懂云上架构升级策略 《华为云DTSE》期刊免费下载:10个案例读懂云上架构升级策略 《华为云DTSE》期刊免费下载:10个案例读懂云上架构升级策略
mysql后台导入sql文件-设定字符集
需求描述:有一个user_info.sql 的文件里面都是插入user_info表的insert语句数据,数据量500M,要求快速插入mysql的数据库中。 解决方法: 1、利用客户端工具加载文件插入数据。 问题:执行数据特别慢,好几个小时才能插入,原因数据要从客户端发送到服务器网络传输和插入都消耗