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++的更多相关文章

  1. 计蒜客 密码锁(BFS)

    https://www.jisuanke.com/course/1797/121114 Description 现在一个紧急的任务是打开一个密码锁.密码由四位数字组成,每个数字从 1 到 9 进行编号 ...

  2. 算法提高 密码锁 (BFS)

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

  3. hdu.1226.超级密码(bfs)

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

  4. 超级密码(bfs)

    超级密码 Time Limit : 20000/10000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other) Total Submis ...

  5. 超级密码 hdu1226 bfs

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

  6. hdu 1226 bfs+余数判重+大数取余

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

  7. HDU-1226 超级密码 (BFS+剪枝)

    Problem Description Ignatius花了一个星期的时间终于找到了传说中的宝藏,宝藏被放在一个房间里,房间的门用密码锁起来了,在门旁边的墙上有一些关于密码的提示信息:密 码是一个C进 ...

  8. hdu1226 超级密码 (BFS,里面用了大数取余原理)

    Problem Description Ignatius花了一个星期的时间终于找到了传说中的宝藏,宝藏被放在一个房间里,房间的门用密码锁起来了,在门旁边的墙上有一些关于密码的提示信息: 密码是一个C进 ...

  9. HDU1226:超级密码(BFS)

    Problem Description Ignatius花了一个星期的时间终于找到了传说中的宝藏,宝藏被放在一个房间里,房间的门用密码锁起来了,在门旁边的墙上有一些关于密码的提示信息: 密码是一个C进 ...

随机推荐

  1. 如何Update跨表修改数据

    大家都知道用Update修改单个表的使用方法,现在来看一下用update 跨表修改数据: 首先创建表 a 然后创建表b 现在要把表b的company  根据ID更新到表a 方法一: update a ...

  2. nginx 简单应用

    从源代码编译 Nginx 把源码解压缩之后,在终端里运行如下命令: $ ./configure $ make $ sudo make install 默认情况下,Nginx 会被安装在 /usr/lo ...

  3. Natively Compiled Code: A Comeback?

    RAD Studio and Natively Compiled Code In today's development landscape, natively compiled code is ma ...

  4. Delphi 与 VC 共享接口和对象

    我经常会用 Delphi 写一些工具和应用,为了扩展方便,大部分都会做成插件形式. 迫于某些原因,我的插件不得不用其他开发工具来完成,比如 VC. 于是有个大问题需要解决:如何让 D 和 VC 互相通 ...

  5. 通过内核对象在服务程序和桌面程序之间通信的小问题 good

    关于在通过 事件对象 在服务程序和普通桌面应用程序相互之间通信的问题,分类情况进行讨论:1.普通桌面应用程序中创建事件,服务程序中打开事件 XP的情况普通桌面应用程序中创建: m_hEvent = : ...

  6. Js 动态插入css js文件

    function loadjscssfile(filename,filetype){ var file, //动态插入的文件 doc = document; if(filetype == " ...

  7. SAP TABLECONTROL 自定义SEARCH HELP

    项目上需要开发一个界面如下的应用程序.这是一个MB1A发料的辅助程序,限制住移动类型和在特定字段写入产品号. 这个应用程序的主要功能毫无疑问是通过BAPI实现的.但在TABLECONTROL中需要对填 ...

  8. NSCache缓存怎么来的

    什么是NSCache NSCache主要用来存储临时数据(键值对),当内存资源不够时,系统会自动释放部分数据.它有三个特点: • NSCache为了保持不占用过多的系统内存,它有多种自动回收内存策略: ...

  9. JVM检测&工具

    前几篇篇文章介绍了介绍了JVM的参数设置并给出了一些生产环境的JVM参数配置参考方案.正如之前文章中提到的JVM参数的设置需要根据应用的特性来进行设置,每个参数的设置都需要对JVM进行长时间的监测,并 ...

  10. webapi使用autofac

    注意:您的项目中如果使用的是webapi2,此处必须为webapi2而不是webapi,否则在运行时将出现“重写成员“Autofac.Integration.WebApi.AutofacWebApiD ...