神奇密码锁(BFS)

题目链接
题目描述
 小明忘记了旅行箱上的密码,现在他想自己暴力弄出密码来,但他又想知道最从一个数字到另一个数字最少需要多少步,现在请你帮忙。
另外,小明的密码箱很奇怪,只有四位数,上面的数字只有1到9,每次只能让每位数加1或者减1。按常识我们可以知道从1到9只需要减1,从9到1只需要加1。此外,你还能交换相邻的两个数字。如1234可以在一步后变成2134,但不能变成4231。

输入
第一行有一个整数:T,代表有多少组测试数据。
接下来T行,每行有两个整数(都是四位数),第一个是初状态,第二个是目标状态。

输出
每组数据输出一个整数,占一行。

样例输入
2
1234 2144
1111 9999
样例输出
2
4
解题思路:
1、求解最优解问题使用BFS进行处理,总共有11种状态变化。
2、判重:每一个状态有唯一对应的数(完美哈希)

#include <iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<queue>
#define error 0
#define ture  1
using namespace std;
struct state
{int a[4];int step;
} ;
state star;
int goal[4];
queue<state>Q;
const int  MaxSize=1e5;
int vis[MaxSize];
int judge(int a[4])
{int temp=a[0]*1000+a[1]*100+a[2]*10+a[3];if(vis[temp]) return error;vis[temp]=1;return ture;
}
int bfs()
{  while(!Q.empty()) Q.pop();Q.push(star);while(!Q.empty()){state N=Q.front();Q.pop();if(memcmp(N.a,goal,sizeof(goal))==0) return N.step;state t;for(int i=0;i<4;i++){ t=N;t.a[i]++;if(t.a[i]>9) t.a[i]=1;t.step++;if(judge(t.a)){Q.push(t);}}for(int i=0;i<4;i++){t=N;t.a[i]--;if(t.a[i]<1) t.a[i]=9;t.step++;if(judge(t.a)){Q.push(t);}}for(int i=0;i<3;i++){t=N;int temp=t.a[i];t.a[i]=t.a[i+1];t.a[i+1]=temp;t.step++;if(judge(t.a)){Q.push(t);}}}return -1;
}
int main()
{  char c[10];int T;scanf("%d",&T);while(T--){  memset(vis,0,sizeof(vis));scanf("%s",c);for(int i=0;i<4;i++)star.a[i]=c[i]-'0';scanf("%s",c);star.step=0;for(int i=0;i<4;i++) goal[i]=c[i]-'0';int sum=bfs();printf("%d",sum);if(T!=0) printf("\n");}
}

神奇密码锁(BFS)相关推荐

  1. 神奇密码锁 bfs

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

  2. 问题 D: 神奇密码锁

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

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

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

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

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

  5. 【BZOJ 4242】水壶

    题目描述 JOI 君所居住的 IOI 市以一年四季都十分炎热著称. IOI 市是一个被分成 纵 H × 横 W 纵H\times 横W 纵H×横W 块区域的长方形,每个区域都是建筑物.原野.墙壁之一. ...

  6. 重走长征路---OI每周刷题记录---6月14日 2014

    总目录详见https://blog.csdn.net/mrcrack/article/details/84471041 做题原则,找不到测评地址的题不做.2018-11-28 重走长征路---OI每周 ...

  7. SDUTOJ3468_广度优先搜索练习之神奇的电梯(BFS + 用vector建图)

    广度优先搜索练习之神奇的电梯 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Problem Description 有一座已 ...

  8. [SDUT](3468)广度优先搜索练习之神奇的电梯 ---BFS(图)

    广度优先搜索练习之神奇的电梯 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Discuss Problem Description ...

  9. 【bfs】密码锁-C++

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

最新文章

  1. linux 为什么 c语言,为什么C程序里一定要写main函数
  2. Ghost后只有一个C盘解决方法(转)
  3. [leetcode] 337.打家劫舍3
  4. Who Gets the Most Candies? POJ - 2886 (线段树)
  5. 为什么我们要使用HTTP Strict Transport Security?
  6. Android笔记 actionbar学习
  7. [人工智能]手语识别转文字落地深圳医院,厉害了我的腾讯
  8. 容器控件StackPanel控件
  9. mysql用命令行创建表_mysql命令行创建表
  10. 计算机1级题库软件,计算机一级软件哪个好_计算机一级刷题软件_计算机一级试题软件...
  11. librtmp读包阻塞问题修复
  12. PHP实现讯飞语音转写demo
  13. WINDOW -- 重装系统报错“找不到适用的引导分区”
  14. 2022 火狐插件 Tamper Data 下载安装使用教程
  15. 8、两种典型微处理器介绍
  16. Dockerfile文件编写官方文档
  17. 支付宝小程序沙箱支付提示(系统繁忙,请稍后再试)
  18. SJ127 篮球积分器
  19. IDA PRO:庆祝成立创新 30 周年
  20. windows下 python 使用 pip 安装TA-Lib报错的原因及解决方法

热门文章

  1. Picocli-快速构建Java命令行程序
  2. cgdisk linux使用教程,Arch Linux安装过程整理
  3. PixHawk飞控 配置参数
  4. java jms clust,activeMQ使用总结 (集群方案)
  5. POJ2187 Beauty Contest(凸包+对踵点对求解)
  6. 17个非常炫酷的后台管理系统模板
  7. Fcitx──小企鹅输入法
  8. Geant4学习记录(一)
  9. 面试网络知识篇之TCP/UDP
  10. 火箭炮:常用正则表达式 收藏!