首页 > 其他分享 >剪枝的应用,bfs判重 蚱蜢跳——蓝桥p642

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

时间:2024-09-27 18:34:28浏览次数:7  
标签:case 剪枝 判重 return int pos 蓝桥 蚱蜢 盘子

**问题描述
总共有九个盘子,八只蚱蜢,且每个盘子中只能容下一只蚱蜢,蚱蜢的编号为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;
}

标签:case,剪枝,判重,return,int,pos,蓝桥,蚱蜢,盘子
From: https://www.cnblogs.com/oQAQo/p/18432720

相关文章

  • 【蓝桥杯】“萌新首秀”全国高校新生编程排位赛2
    1.世上有10种人题目世上有10种人 代码#includeusingnamespacestd;intmain(){cout<<2;return0;}2.01切换题目01切换 题目分析直接判断字符串最后一个字符是0还是1就好了代码#includeusingnamespacestd;intmain(){stringstr;cin>>st......
  • 第十五届蓝桥杯javaA组 砍柴 (两种写法)详解
    参考资料原题链接砍柴-蓝桥云课(lanqiao.cn)区间质数搜索——埃拉托斯特尼筛法和欧拉筛法-CSDN博客思路质数筛+二分+博弈+状态机(只因bushi)$$状态转移方程 dp[i] = !dp[i-p]$$由原始题意可以看出砍树长度限制为小于其长度的质数——暗示你使用质数筛交替砍......
  • 蓝桥4-R格式-1
    知识铺垫(高精度算法):在C/C++中,我们经常会碰到限定数据范围的情况,C++规定:int占32位,即4个字节,即int的范围是[-231,231-1],为10^9数量级longlong占64位,即8个字节,即longlong的范围是[-263,263-1],为10……18数量级如果超过该数量级,则需引入高精度算法。1.高精度加法A+BProblem(......
  • 【每周例题】蓝桥杯 C++ 数树数
    数树数题目数树数题目分析通过图片的二叉树,我们可以发现每一个·分支的L=2a-1R=2a代码#include<iostream>#include<string>usingnamespacestd;chars[50];inta;intmain(){intn,q;cin>>n>>q;for(inti=0;i<q;i++){......
  • 【每周例题】蓝桥杯 C++ 生物芯片
    生物芯片题目生物芯片题目分析·1.下面是亮灯规律,剩下的以此类推:我们可以看到,不亮灯的都是n的平方 2.所以亮灯的数目=该区间内所有灯的数量-不亮灯的数目(简而言之,所有不亮灯的号码开方后都是整数)代码#include<iostream>#include<cmath>usingnamespacestd;......
  • 蓝桥杯3-好数
    #include<iostream>usingnamespacestd;boolcheck(intx){intwei=1;//用于计算位数while(x){intb=x%10;//b表示对应位数的数字if(wei%2==1)//如果是奇数位{if(b%2==0)//如果奇数位是偶数,返回为假......
  • 简单搜索(BFS,DFS,剪枝)一网打尽
    深搜DFS含义深搜是一种遍历或搜索图和树的算法。实现方式(不撞南墙不回头)根据题目选择一个适合的源节点,从源节点开始选择一条路一直走,直到无法前进(不满足题目条件)时,返回到上一个节点重新尝试,直到当前的节点的所有子节点都已经被访问过,再次返回到当前节点的上一节点,继续重复......
  • 蓝桥杯嵌入式冲刺国奖-3、LCD程序
    在上一章的基础上我们构建LCD程序的模板。1、用官方程序进行移植官方资源包:通过百度网盘分享的文件:2-新版竞赛平台.zip链接:https://pan.baidu.com/s/1Z8mD4NrywlqbpUEDKSHAtw?pwd=1234 提取码:1234 官方为我们提供了LCD的资源包,我们仅需要移植即可使用,我们在上节代码......
  • 蓝桥杯嵌入式的学习总结
    一.前言    嵌入式竞赛实训平台(CT117E-M4)是北京国信长天科技有限公司设计,生产的一款“蓝桥杯全国软件与信息技术专业人才大赛-嵌入式设计与开发科目“专用竞赛平台,平台以STM32G431RBT6为主控芯片,预留扩展板接口,可为用户提供丰富的实验场景。以下内容都是小编......
  • 【洛谷】P10417 [蓝桥杯 2023 国 A] 第 K 小的和 的题解
    【洛谷】P10417[蓝桥杯2023国A]第K小的和的题解题目传送门题解CSP-S1补全程序,致敬全A的答案,和神奇的预言家。写一下这篇的题解说不定能加CSP2024的RP代码#include<bits/stdc++.h>#definelowbit(x)x&(-x)#defineendl"\n"usingnamespacestd......