【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进 ... 
随机推荐
- web appbuilder 正式版用yo esri-appbuilder-js:widget生成widget读取不到config解决方案
			对于在webappBuilder正式版中,如果用yo esri-appbuilder-js:widget生成的widget,在写widget的时候widget里面的config.json ... 
- Delphi 屏幕抓图技术的实现
			摘 要:本文以Delphi7.0作为开发平台,给出了网络监控软件中的两种屏幕抓图技术的设计方法和步骤.介绍了教师在计算机机房内教学时,如何监控学生计算机显示器上的画面,以保证教学的质量和效果. 引言 ... 
- PHP开发框架 Laravel
			Laravel 是一套简洁.优雅的PHP Web开发框架(PHP Web Framework).它可以让你从面条一样杂乱的代码中解脱出来:它可以帮你构建一个完美的网络APP,而且每行代码都可以简洁.富 ... 
- asp.net mvc PC端二维码支付实例(微信二维码支付)
			一.微信支付方式介绍 微信提供了各种支付方式,试用于各种不同的支付场景,主要有如下几种: 1.刷卡支付 刷卡支付是用户展示微信钱包内的“刷卡条码/二维码”给商户系统扫描后直接完成支付的模式.主要应用线 ... 
- git(二)
			一.GitHub(代码的云仓库) 1.创建一个新的项目 git remote add origin https://github.com/1352282824shy/COCAP.git git pus ... 
- 向HashMap中添加1000个元素,设置new HashMap()值为多少合适?
			在已知元素容量的情况下,为了尽量减少碰撞增加查询效率,应该尽量选择较大数的同时避免资源浪费. HashMap底层通过hash值来计算索引位置的源码: 1.重新计算hash值 static final ... 
- 简单学习js
			由于是个前端小白,通过这一两天的学习html,css,js和jquery等,基本上前端会用了,而且熟悉我博客的人来说,没错,我把自己的博客给优化了一下(一些大佬都是禁用模板的所有样式,然后自己设计页面 ... 
- 曹工说Tomcat1:从XML解析说起
			一.前言 第一次被人喊曹工,我相当诧异,那是有点久的事情了,楼主13年校招进华为,14年在东莞出差,给东莞移动的通信设备进行版本更新.他们那边的一个小伙子来接我的时候,这么叫我的,刚听到的时候,心里一 ... 
- spark 2.x在windows环境使用idea本地调试启动了kerberos认证的hive
			1 概述 开发调试spark程序时,因为要访问开启kerberos认证的hive/hbase/hdfs等组件,每次调试都需要打jar包,上传到服务器执行特别影响工作效率,所以调研了下如何在window ... 
- spark 源码分析之二 -- SparkContext 的初始化过程
			创建或使用现有Session 从Spark 2.0 开始,引入了 SparkSession的概念,创建或使用已有的session 代码如下: val spark = SparkSession .bui ... 
