剪枝的应用,bfs判重 蚱蜢跳——蓝桥p642
**问题描述
总共有九个盘子,八只蚱蜢,且每个盘子中只能容下一只蚱蜢,蚱蜢的编号为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;
}
剪枝的应用,bfs判重 蚱蜢跳——蓝桥p642的更多相关文章
- Keyboarding (bfs+预处理+判重优化)
# #10030. 「一本通 1.4 练习 2」Keyboarding [题目描述] 给定一个 $r$ 行 $c$ 列的在电视上的"虚拟键盘",通过「上,下,左,右,选择」共 $5 ...
- UVA 10651 Pebble Solitaire(bfs + 哈希判重(记忆化搜索?))
Problem A Pebble Solitaire Input: standard input Output: standard output Time Limit: 1 second Pebble ...
- 八数码问题+路径寻找问题+bfs(隐式图的判重操作)
Δ路径寻找问题可以归结为隐式图的遍历,它的任务是找到一条凑够初始状态到终止问题的最优路径, 而不是像回溯法那样找到一个符合某些要求的解. 八数码问题就是路径查找问题背景下的经典训练题目. 程序框架 p ...
- hdu 1226 bfs+余数判重+大数取余
题目: 超级密码 Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total ...
- 逆向bfs搜索打表+康拓判重
HDU 1043八数码问题 八数码,就是1~8加上一个空格的九宫格,这道题以及这个游戏的目标就是把九宫格还原到从左到右从上到下是1~8然后最后是空格. 没了解康托展开之前,这道题怎么想都觉得很棘手,直 ...
- BFS+Hash(储存,判重) HDOJ 1067 Gap
题目传送门 题意:一个图按照变成指定的图,问最少操作步数 分析:状态转移简单,主要是在图的存储以及判重问题,原来队列里装二维数组内存也可以,判重用神奇的hash技术 #include <bits ...
- 洛谷 P1379 八数码难题 Label:判重&&bfs
特别声明:紫书上抄来的代码,详见P198 题目描述 在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格,空格用0来表示.空格周围的棋子可以移到空格中.要求解的问题是:给 ...
- poj 1465 Multiple(bfs+余数判重)
题意:给出m个数字,要求组合成能够被n整除的最小十进制数. 分析:用到了余数判重,在这里我详细的解释了.其它就没有什么了. #include<cstdio> #include<cma ...
- poj 1564 Sum It Up | zoj 1711 | hdu 1548 (dfs + 剪枝 or 判重)
Sum It Up Time Limit : 2000/1000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other) Total Sub ...
- hdu 4444 Walk (离散化+建图+bfs+三维判重 好题)
Walk Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total Submi ...
随机推荐
- 记一次 Redisson 线上问题 → 你怎么能释放别人的锁
开心一刻 今天,我的又一个好哥们脱单了,只剩下我自己单身了 我向一个我喜欢的女生吐苦水 我:我这辈子是找不到女朋友了 她:怎么可能,你很优秀的,会有很多女孩子愿意当你女朋友的 我内心窃喜,问道:那你愿 ...
- springsecurity流程梳理与总结
springsecurity的基本使用方法学习完了,还是有些懵圈,再回过头来梳理一下流程以及使用情况 1-4.传一个User实体,new一个UserPasswordAuthenticationToke ...
- Codeforces Round 947 (Div. 1 + Div. 2) A~H
Codeforces Round 947 (Div. 1 + Div. 2) A 模拟. B 最小的 \(a\) 肯定作为 \(i\).对于不被 \(i\) 整除的,最小的那个作为 \(j\),判断是 ...
- 【DataBase】MySQL 31 游标
游标 Cursor 游标是用来存储查询的结果集的数据类型,也称为是光标 在存储过程和函数中可以使用光标对结果集进行循环的处理 光标的使用包括1.声明,2.开启,3.关闭,4.Fetch 游标仅用于存储 ...
- conda/anconda报错:WARNING conda.models.version:get_matcher(556): Using .* with relational operat
conda/anconda报错:WARNING conda.models.version:get_matcher(556): Using .* with relational operat 解决方法, ...
- (续 2 )在深度计算框架MindSpore中如何对不持续的计算进行处理——对数据集进行一定epoch数量的训练后,进行其他工作处理,再返回来接着进行一定epoch数量的训练——单步计算
内容接前文: https://www.cnblogs.com/devilmaycry812839668/p/14988686.html https://www.cnblogs.com/devilmay ...
- MindSpore 初探, 使用LeNet训练minist数据集
如题所述,官网地址: https://www.mindspore.cn/tutorial/zh-CN/r1.2/quick_start.html 数据集下载: mkdir -p ./datasets/ ...
- Linux统计文件目录下文件的数目命令
Linux下有三个命令:ls.grep.wc.通过这三个命令的组合可以统计目录下文件及文件夹的个数. 1.ls -l | grep "^-" | wc -l:统计当前目录下文件的个 ...
- cnetos7.3离线安装vscode
1.从官网下载压缩包(话说下载下来解压就直接可以运行了咧,都不需要make) #下载vscode包 访问Visual Studio Code官网 https://code.visualstudio.c ...
- Nuitka打包
Nuitka打包PySide6/PyQt 本文仅供本人知识总结使用,所以内容会比较浅显,不喜勿喷. 文章目录 Nuitka打包PySide6/PyQt 一.需要C++编译器 二.安装Nuitka 三. ...