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

这个锁上面看起来有  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

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

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

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

#include<iostream>
#include<algorithm>
#include<queue>
#include<string>
#include<set> using namespace std;
typedef pair<string,int> P;
queue<P>Q;set<string>S;
int n;
bool goal(string str)//判断是否有达到开锁的条件
{
for(int i=;i+<str.size();i++)
if(str[i]==''&&str[i+]==''&&str[i+]==''&&str[i+]=='')
return true;
return false;
}
void BFS()
{
while(!Q.empty())
{
P q = Q.front();
Q.pop();
if(goal(q.first))//判断有没有达到可以开锁的状态
{
cout<<q.second<<endl;
return;
}
for(int i=;i<q.first.size()-;i++)
{
string str = q.first;
if(str[i]!=str[i+])
{
swap(str[i],str[i+]);
if(goal(str))
{
cout<<q.second+<<endl;
return;
}
if(S.count(str)!=)//剪枝 对于已经出现过的状态就不必再继续
{ //存入队列 例如22010 如果在之后的的交换中
S.insert(str); //再一次出现22010 则不需要再对它进行交换
P p; //S 是set类型 用于记录每一种情况有没有出现过
p.first = str; //没有则将其加入队列 加入集合
p.second = q.second+;
Q.push(p);
}
}
} }
cout<<"-1"<<endl;
}
int main()
{
string str;
P p;
while(cin>>n>>str)
{
S.clear();
while(!Q.empty())
Q.pop();
p.first = str;
p.second = ;
Q.push(p);
BFS();
} return ;
}

算法提高 密码锁 (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. Oracle之PL/SQL编程

    PL/SQL(Procedural Language/SQL,过程语言/SQL) 是结合了Oracel过程语言和结构化查询语言(SQL)的一种扩展语言. 优点: (1)PL/SQL具有编程语言的特点, ...

  2. bzoj1231 混乱的奶牛

    Description 混乱的奶牛 [Don Piele, 2007] Farmer John的N(4 <= N <= 16)头奶牛中的每一头都有一个唯一的编号S_i (1 <= S ...

  3. docker在windows下的安装

    Docker for Windows会默认包含两个引擎containers(linux和windows) 1. 下载Docker for Windows,https://docs.docker.com ...

  4. 解决PowerDesigner中DBMS选项卡为空白

    点击DBMS后面的黄色(浏览)文件图标, 找到安装目录里面PowerDesigner \Resource Files\DBMS,就可以了.

  5. HDU_1061:Rightmost Digit

    Problem Description Given a positive integer N, you should output the most right digit of N^N.   Inp ...

  6. Nginx 缓存代理

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

  7. iOS之友盟错误统计解决

    http://www.cocoachina.com/ios/20150720/12627.html http://lieyunye.github.io/blog/2013/09/10/how-to-a ...

  8. 12 将类处理为excel,再将excel处理为类(界限计划3)

    中间使用map作为中间处理 将类处理为excel: 1.读取类转为map //读取btl,转为map public static Map getBtlMap(String rule, BTLDAO b ...

  9. 【Flask源码分析——请求上下文与应用上下文】

    Flask中有两种上下文,请求上下文和应用上下文.两者的作用域都处于一个请求的局部中. 查看源代码,上下文类在flask.ctx模块中定义 AppContext类定义应用上下文,app是当前应用Web ...

  10. 自定义View系列教程06--详解View的Touch事件处理

    深入探讨Android异步精髓Handler 站在源码的肩膀上全解Scroller工作机制 Android多分辨率适配框架(1)- 核心基础 Android多分辨率适配框架(2)- 原理剖析 Andr ...