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

这个锁上面看起来有  N  个数字,它们排成一排,并且每个数字都在  0  到  2 
之间。你发现你可以通过锁上的机关来交换相邻两个数字的顺序。比如,如果原来有  5  个数字  02120,在一次交换以后你就可以得到 
20120,01220,02210  或者  02102。

根据你所搜集的情报,这个锁在上面存在某连续四个数字是“2012”的时候会自动打开。现在,你需要计算一下,你至少需要进行多少次交换操作才能打开这把锁?

输入格式
输入数据的第一行有一个正整数  N。(4  ≤  N  ≤  13)  输入数据的第二行有  N  个数字  a1,a2, 
...,  aN  ,其中  ai  表示这个锁上面第  i  个数字的值,满足  0  ≤  ai  ≤  2。这些数字之间没有空格分隔。
输出格式

你只需要输出一个数字,即你至少需要的交换次数。如果无论如何都没有希望打开这把锁,输出  -1。
样例输入
5
02120

样例输出
1
对样例的解释
把前两个数字交换以后,锁上的数字是  20120,其中存在连续四个数字2,  0,  1, 
2,因此锁会打开。

思路: 对于开锁是当且仅当给定的的n个数字中出现2012,我们可以将这几个数字当成字符串输入 因为是求最小交换次数并且是每一次是一种新的状态所以我们很容易想到用BFS

将每一次交换后的新的状态和当前的交换次数加入队列,每一次判断是否达到开锁的状态;

注意: 因为每一次的交换可能会出现相同的状态 所以我们在交换之后要注意 首先:如果即将交换的=两个数字不同才进行交换,其次 如果交换后的状态已经出现过了就不用入队了

好了话不多说 直接上代码吧

  1. #include<iostream>
  2. #include<algorithm>
  3. #include<queue>
  4. #include<string>
  5. #include<set>
  6.  
  7. using namespace std;
  8. typedef pair<string,int> P;
  9. queue<P>Q;set<string>S;
  10. int n;
  11. bool goal(string str)//判断是否有达到开锁的条件
  12. {
  13. for(int i=;i+<str.size();i++)
  14. if(str[i]==''&&str[i+]==''&&str[i+]==''&&str[i+]=='')
  15. return true;
  16. return false;
  17. }
  18. void BFS()
  19. {
  20. while(!Q.empty())
  21. {
  22. P q = Q.front();
  23. Q.pop();
  24. if(goal(q.first))//判断有没有达到可以开锁的状态
  25. {
  26. cout<<q.second<<endl;
  27. return;
  28. }
  29. for(int i=;i<q.first.size()-;i++)
  30. {
  31. string str = q.first;
  32. if(str[i]!=str[i+])
  33. {
  34. swap(str[i],str[i+]);
  35. if(goal(str))
  36. {
  37. cout<<q.second+<<endl;
  38. return;
  39. }
  40. if(S.count(str)!=)//剪枝 对于已经出现过的状态就不必再继续
  41. { //存入队列 例如22010 如果在之后的的交换中
  42. S.insert(str); //再一次出现22010 则不需要再对它进行交换
  43. P p; //S 是set类型 用于记录每一种情况有没有出现过
  44. p.first = str; //没有则将其加入队列 加入集合
  45. p.second = q.second+;
  46. Q.push(p);
  47. }
  48. }
  49. }
  50.  
  51. }
  52. cout<<"-1"<<endl;
  53. }
  54. int main()
  55. {
  56. string str;
  57. P p;
  58. while(cin>>n>>str)
  59. {
  60. S.clear();
  61. while(!Q.empty())
  62. Q.pop();
  63. p.first = str;
  64. p.second = ;
  65. Q.push(p);
  66. BFS();
  67. }
  68.  
  69. return ;
  70. }

算法提高 密码锁 (BFS)的更多相关文章

  1. Java实现 蓝桥杯VIP 算法提高 密码锁

    算法提高 题目 2 密码锁 时间限制:1.0s 内存限制:1.0GB 问题描述 你获得了一个据说是古代玛雅人制作的箱子.你非常想打开箱子看看里面有什么东西,但是不幸的是,正如所有故事里一样,神秘的箱子 ...

  2. 蓝桥杯 算法提高 学霸的迷宫 经典BFS问题

      算法提高 学霸的迷宫   时间限制:1.0s   内存限制:256.0MB      问题描述 学霸抢走了大家的作业,班长为了帮同学们找回作业,决定去找学霸决斗.但学霸为了不要别人打扰,住在一个城 ...

  3. Java实现 蓝桥杯 算法提高 八数码(BFS)

    试题 算法提高 八数码 问题描述 RXY八数码 输入格式 输入两个33表格 第一个为目标表格 第二个为检索表格 输出格式 输出步数 样例输入 1 2 3 4 5 6 7 8 0 1 2 3 4 5 6 ...

  4. 算法笔记_107:蓝桥杯练习 算法提高 学霸的迷宫(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 学霸抢走了大家的作业,班长为了帮同学们找回作业,决定去找学霸决斗.但学霸为了不要别人打扰,住在一个城堡里,城堡外面是一个二维的格子迷宫,要 ...

  5. 蓝桥杯--算法提高 排列数 (简单dfs)

    算法提高 排列数   时间限制:1.0s   内存限制:256.0MB      问题描述 0.1.2三个数字的全排列有六种,按照字母序排列如下: 012.021.102.120.201.210 输入 ...

  6. Java实现 蓝桥杯 算法提高 学霸的迷宫

    算法提高 学霸的迷宫 时间限制:1.0s 内存限制:256.0MB 问题描述 学霸抢走了大家的作业,班长为了帮同学们找回作业,决定去找学霸决斗.但学霸为了不要别人打扰,住在一个城堡里,城堡外面是一个二 ...

  7. 蓝桥杯算法提高 P1001(大数乘法)

      算法提高 P1001   时间限制:1.0s   内存限制:256.0MB   当两个比较大的整数相乘时,可能会出现数据溢出的情形.为避免溢出,可以采用字符串的方法来实现两个大数之间的乘法. 具体 ...

  8. 机器学习实战 - 读书笔记(07) - 利用AdaBoost元算法提高分类性能

    前言 最近在看Peter Harrington写的"机器学习实战",这是我的学习笔记,这次是第7章 - 利用AdaBoost元算法提高分类性能. 核心思想 在使用某个特定的算法是, ...

  9. 算法提高 c++_ch02_01

    http://lx.lanqiao.org/problem.page?gpid=T237  算法提高 c++_ch02_01   时间限制:1.0s   内存限制:512.0MB      编写一个程 ...

随机推荐

  1. 关于 SSD 的接口和相关名词(2019-09-10)

    关于 SSD 的接口和相关名词 了解了很多天的 SSD,太多的名词. 先记录一下. SATA MSATA M2 NVME NGFF U2 TODO: 后续收集相关信息.

  2. mysql中bigint、int、mediumint、smallint与tinyint的取值范围

    https://blog.csdn.net/github_39110707/article/details/74277381 mysql数据库设计,其中对性能优化,字段类型很重要,下面对bigint. ...

  3. oracle loader

    控制文件的格式    load data    infile '数据文件名'    into table 表名    (first_name position(01:14) char,     sur ...

  4. Nginx 缓存代理

    访问ArcGIS官网的地图瓦片太慢.想到可用NIGIX代理. Nginx是Linux下http代理软件,Windows下也有. 以下为配置方法,注意红色部分. 1.需要在本地proxy_cache_p ...

  5. 2016 Asia Jakarta Regional Contest J - Super Sum UVALive - 7720 【快速幂+逆元】

    J-Super Sum 题目大意就是给定N个三元组<a,b,c>求Σ(a1^k1*a2^k2*...*ai^ki*..an^kn)(bi<=ki<=ci) 唉.其实题目本身不难 ...

  6. UVa 10520【递推 搜索】

    UVa 10520 哇!简直恶心的递推,生推了半天..感觉题不难,但是恶心,不推出来又难受..一不小心还A了[]~( ̄▽ ̄)~*,AC的猝不及防... 先递推求出f[i][1](1<=i< ...

  7. jenkins集成错误 标签: 发布 2016-01-10 20:45 747人阅读 评论(21) 收藏

    进入ITOO的项目以后,终于要将自己负责的模块在jenkins上面集成发布了.首先自己按照文档要求一步一步的将配置完成,然后构建,不错所料出错了,经过修改,终于构建成功!构建成功以后就没再管了,结果第 ...

  8. POJ-3615_Cow Hurdles

    Cow Hurdles Time Limit: 1000MS Memory Limit: 65536K Description Farmer John wants the cows to prepar ...

  9. mysql把一个表的字段update成另一个表的字段根据id

    mysql把一个表的字段update成另一个表的字段根据id 1.填充activity表里面的creator字段,用org的founderid,其中activity的orgid要和org的id对应,具 ...

  10. @codeforces - 1205E@ Expected Value Again

    目录 @description@ @solution@ @part - 1@ @part - 2@ @part - 3@ @solution@ @details@ @description@ 给定两个 ...