Description
现在一个紧急的任务是打开一个密码锁。密码由四位数字组成,每个数字从 1 到 9 进行编号。每次可以对任何数字加 1 或减 1。当将9加 1 时,数字将变为1,当1减 1 的时,数字将变为9。您也可以与邻居交换数字,每一个行动记做一步。现在你的任务是使用最小的步骤来打开锁。
注意:最左边的数字不是最右边数字的邻居。
Input
第一行输入四位数字,表示密码锁的初始状态。第二行输入四位数字,表示开锁的密码。
Output
输出一个整数,表示最小步骤。
Sample Input 1
1234
2144
Sample Output 1
2

这道题一看,似乎不该用搜索。
又一想,这种题目也只能使用bfs来完成。

但是怎么打标记?

普通的一维的vis数组已经无法满足这道题目的需求了,应该怎么解决?
再认真一看,它的起始和重点都是4个数字构成,我们可以把由4个数字组成的一组密码记为一种状态,即:
当密码为abcd时,对应的标记就应该记为vis[a][b][c][d]=1;
简单来说,就是通过四维数组,完成打标记这一步。
接下来的操作就是最基本的bfs,代码随便敲下来就可以了。
按照题意,每个密码能够进行的拓展操作分别为:
每一位加/减一位构成的新密码;
分别交换第1,2/2,3/3,4位构成的新密码;
然后判断,如果是没有打标记的,打进队列然后打标记即可。

AC代码:

#include<bits/stdc++.h>
using namespace std;struct node
{int aa[4];int t;node(){};node(int a0,int a1,int a2,int a3,int t_){aa[0]=a0;aa[1]=a1;aa[2]=a2;aa[3]=a3;t=t_;}
}mb;//mb:目标
bool x[10][10][10][10];
queue<node> qu;bool in(node a)
{if(a.aa[0]==mb.aa[0]&&a.aa[1]==mb.aa[1]&&a.aa[2]==mb.aa[2]&&a.aa[3]==mb.aa[3])return false;else return true;
}int bfs(int a,int b,int c,int d)
{qu.push(node(a,b,c,d,0));x[a][b][c][d]=1;while(in(qu.front())&&!qu.empty()){node now=qu.front();qu.pop();if(!x[now.aa[1]][now.aa[0]][now.aa[2]][now.aa[3]]){qu.push(node(now.aa[1],now.aa[0],now.aa[2],now.aa[3],now.t+1));x[now.aa[1]][now.aa[0]][now.aa[2]][now.aa[3]]=1;}//a,b,c,d->b,a,c,d if(!x[now.aa[0]][now.aa[2]][now.aa[1]][now.aa[3]]){qu.push(node(now.aa[0],now.aa[2],now.aa[1],now.aa[3],now.t+1));x[now.aa[0]][now.aa[2]][now.aa[1]][now.aa[3]]=1;}//a,b,c,d->a,c,b,dif(!x[now.aa[0]][now.aa[1]][now.aa[3]][now.aa[2]]){qu.push(node(now.aa[0],now.aa[1],now.aa[3],now.aa[2],now.t+1));x[now.aa[0]][now.aa[1]][now.aa[3]][now.aa[2]]=1;}//a,b,c,d->a,b,d,c//因为a和d 不能直接交换所以就只有这三种情况 for(int i=0;i<4;i++){node nxt=now;nxt.aa[i]++;nxt.t++;if(nxt.aa[i]==10)nxt.aa[i]=1;if(!x[nxt.aa[0]][nxt.aa[1]][nxt.aa[2]][nxt.aa[3]]){qu.push(nxt);x[nxt.aa[0]][nxt.aa[1]][nxt.aa[2]][nxt.aa[3]]=1;}}for(int i=0;i<4;i++){node nxt=now;nxt.aa[i]--;nxt.t++;if(nxt.aa[i]==0)nxt.aa[i]=9;if(!x[nxt.aa[0]][nxt.aa[1]][nxt.aa[2]][nxt.aa[3]]){qu.push(nxt);x[nxt.aa[0]][nxt.aa[1]][nxt.aa[2]][nxt.aa[3]]=1;}}}return qu.front().t;}int main()
{int st,ed;cin>>st>>ed;mb=node(ed/1000,ed%1000/100,ed%100/10,ed%10,0);cout<<bfs(st/1000,st%1000/100,st%100/10,st%10)<<endl;return 0;
}

ov.

转载于:https://www.cnblogs.com/moyujiang/p/11167781.html

【bfs】密码锁-C++相关推荐

  1. 神奇密码锁 bfs

    问题 D: 神奇密码锁 时间限制: 2 Sec  内存限制: 128 MB 提交: 204  解决: 53 [提交][状态][讨论版] 题目描述 小明忘记了旅行箱上的密码,现在他想自己暴力弄出密码来, ...

  2. 计蒜客:密码锁---bfs

    计蒜客:密码锁-bfs 题目描述: 现在一个紧急的任务是打开一个密码锁.密码由四位数字组成,每个数字从1到9进行编号.每次可以对任何一位数字加1或减1.当将9加1时,数字变为1,当1减1时,数字变为9 ...

  3. 神奇密码锁(BFS)

    神奇密码锁(BFS) 题目链接 题目描述  小明忘记了旅行箱上的密码,现在他想自己暴力弄出密码来,但他又想知道最从一个数字到另一个数字最少需要多少步,现在请你帮忙. 另外,小明的密码箱很奇怪,只有四位 ...

  4. [蓝桥杯][算法提高VIP]密码锁(BFS)

    题目描述 你获得了一个据说是古代玛雅人制作的箱子.你非常想打开箱子看看里面有什么东西,但是不幸的是,正如所有故事里一样,神秘的箱子出现的时候总是会挂着神秘的锁. 这个锁上面看起来有 N 个数字,它们排 ...

  5. 练习22,密码锁【广搜BFS】

    密码锁 - 问题 - USCOJ (大家加油哦!) 题目: 你获得了一个据说是古代玛雅人制作的箱子.你非常想打开箱子看看里面有什么东西,但是不幸的是,正如所有故事里一样,神秘的箱子出现的时候总是会挂着 ...

  6. hdu 1226(bfs+同余剪枝)

    超级密码 Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Sub ...

  7. 【leetcode】开密码锁

    一. 题目描述 一个密码锁由 4 个环形拨轮组成,每个拨轮都有 10 个数字: '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' .每个拨轮可以自由旋转 ...

  8. offer_II_109开密码锁

    开密码锁 一个密码锁由 4 个环形拨轮组成,每个拨轮都有 10 个数字: '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' .每个拨轮可以自由旋转:例如 ...

  9. 问题 D: 神奇密码锁

    今天小编又来跟新了 没办法A题目速度不高啊 本人还在处于训练状态请多多包涵 最近在训练DFS以及BFS  今天我来说说神奇密码锁问题 在做这个题目的过程中有思路 然后想上网找找 发现没有博客写关于这个 ...

最新文章

  1. 跨平台PHP调试器设计及使用方法——立项
  2. html游戏键盘控制,键盘控制方块移动.html
  3. 一些常用正则表达解析
  4. Python开发基础--- 进程间通信、进程池、协程
  5. preg_match_all中的标记
  6. 女孩子怎样能赚到月薪一万
  7. x86汇编指令:EIP、ESP、EBP
  8. 新版的iMessage就是iOS 10内隐形的浏览器
  9. 算法复习——带修改莫队(bzoj2453)
  10. 计算机辅助与设计专业,计算机辅助设计与制造专业怎么样?
  11. 微信公众号推送模板跳转小程序
  12. 微信小程序 tabs 选项卡 分页加载 + 图片上传
  13. 通过代理下载Google Code
  14. matlab中邮递员问题实例,中国邮递员问题的求解实例.doc
  15. 使用JavaScript实现一个俄罗斯方块
  16. 软件单元测试文档,演示文稿软件应用单元测试题
  17. python%是什么意思_%在Python中是什么意思?
  18. Python3输出所有大小写字母(字母表)、数字
  19. 如何做一个优秀的团队成员
  20. 04-MPI几个基本函数

热门文章

  1. VS2008假死点击无反应解决办法
  2. AMADA阿玛达工控机维修折弯机主机维修R027-00主板故障处理
  3. hui后台框架html页面中的图标,HUI
  4. 常见对象-String类
  5. python三张照片画面拼接
  6. 学术论文等级划分(包括EI会议论文)
  7. ios 导航条消失 navigationBar.hidden 和 navigationBarHidden 区别
  8. 晚安西南-----液气分离器
  9. VR全景为家装赋能,沉浸式体验家装设计效果
  10. mysql 性能优化方案