【bfs】密码锁-C++
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,d
if(!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.
【bfs】密码锁-C++的更多相关文章
- 计蒜客 密码锁(BFS)
https://www.jisuanke.com/course/1797/121114 Description 现在一个紧急的任务是打开一个密码锁.密码由四位数字组成,每个数字从 1 到 9 进行编号 ...
- 算法提高 密码锁 (BFS)
问题描述 你获得了一个据说是古代玛雅人制作的箱子.你非常想打开箱子看看里面有什么东西,但是不幸的是,正如所有故事里一样,神秘的箱子出现的时候总是会挂着神秘的锁. 这个锁上面看起来有 N 个数字,它 ...
- hdu.1226.超级密码(bfs)
超级密码 Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Sub ...
- 超级密码(bfs)
超级密码 Time Limit : 20000/10000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other) Total Submis ...
- 超级密码 hdu1226 bfs
超级密码 Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Subm ...
- hdu 1226 bfs+余数判重+大数取余
题目: 超级密码 Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total ...
- HDU-1226 超级密码 (BFS+剪枝)
Problem Description Ignatius花了一个星期的时间终于找到了传说中的宝藏,宝藏被放在一个房间里,房间的门用密码锁起来了,在门旁边的墙上有一些关于密码的提示信息:密 码是一个C进 ...
- hdu1226 超级密码 (BFS,里面用了大数取余原理)
Problem Description Ignatius花了一个星期的时间终于找到了传说中的宝藏,宝藏被放在一个房间里,房间的门用密码锁起来了,在门旁边的墙上有一些关于密码的提示信息: 密码是一个C进 ...
- HDU1226:超级密码(BFS)
Problem Description Ignatius花了一个星期的时间终于找到了传说中的宝藏,宝藏被放在一个房间里,房间的门用密码锁起来了,在门旁边的墙上有一些关于密码的提示信息: 密码是一个C进 ...
随机推荐
- 【Windows10 IoT开发系列】Powershell命令行实用程序
原文:[Windows10 IoT开发系列]Powershell命令行实用程序 更新帐户密码: 强烈建议你更新默认的管理员帐户密码.若要更新帐户密码,你可以发出以下命令: net user Admin ...
- PHPstudy + phpstrom +xdebug 断点调试(windows) - CSDN博客
原文:PHPstudy + phpstrom +xdebug 断点调试(windows) - CSDN博客 php.ini 配置 需要添加如下内容 [XDebug]xdebug.profiler_ou ...
- C++/CLI 中使用 ref 和 out
void fun(int^ % i){} // C# ref void fun([out]int^ % i) {} // C# out
- .NET重思(三)-数组列表与数组的区别,栈集合和队列结合的区别
数组列表和数组十分相似,区别在于数组列表的容量是可以动态变化的,而数组的容量是固定的.数组即Array类,数组列表即ArrayList类,两者十分相似.不过,Array类在System命名空间下,Ar ...
- Play Framework 模板里使用注入访问数据层
从Play2.4开始,推荐使用依赖注入替代静态控制器.因此我们不能像play2.3那样,在模板里直接调用object访问数据层.是的,我们还是可以使用常规方式,通过传参到模板里.不过这样很多时候不方便 ...
- 使用Netty实现通用二进制协议的高效数据传输
Netty是一个高性能的NIO通信框架,提供异步的.事件驱动的网络编程模型.使用Netty可以方便用户开发各种常用协议的网络程序.例如:TCP.UDP.HTTP等等. Netty的最新版本是3.2.7 ...
- 浅谈Linux(Centos7.4)环境下NTP服务器的构建
一.软件环境 1.操作系统版本 [root@Geeklp201 etc]# cat /etc/redhat-release CentOS Linux release 7.4.1708 (Core ...
- 不一样的go语言-玩转语法之二
本文继续玩转语法,是为之二. I/O(Input/Output),输入输出是计算机最为突出的特点,也可以说是计算机最为核心的功能.没有I/O,计算机就是一堆废铜废铁.从最低层的电子元器件开始, ...
- 【UVA - 11624】Fire!
-->Fire! 直接上中文 Descriptions: 乔在迷宫中工作.不幸的是,迷宫的一部分着火了,迷宫的主人没有制定火灾的逃跑计划.请帮助乔逃离迷宫.根据乔在迷宫中的位置以及迷宫的哪个方块 ...
- 【设计模式】行为型01策略模式(strategy patten)
学设计模式一段时间了,有些懂了,有些半知半解,通过写笔记博客的方式总结一下: 关于策略模式,我的个人理解就是将一些经常变动的算法独立抽取出来,可以是一个方法,也可以是一个策略类,这样,如果有需求变更, ...