题目:

输入长度为N,且只含'0''1''2'的字符串(2=<N<=13),问每次移动相邻的两个数字,最少经过多少次,可使字符串含有"2012"。如果无解,输出-1。(例如02120经过一次移位,可以得到20120,01220,02210,02102,其中20120符合要求,因此输出为1。)

思路:

广度优先遍历(BFS),过程借用队列。
字符串通过1次移动产生的所有新子串,为其子结点。去除和爷爷结点以及父亲结点相同的子结点,然后其余入队。再出队,遍历。
如此循环,直到产生解。

学习体会:

1.程序中的isHave2012()函数,其实是模式匹配函数,其有改进算法,参见《数据结构》。
2.相关的模式匹配函数有:

字符匹配:在<string.h>中有char* strchr(char *s,char c):字符c在字符串s中首次出现的地址。
字符串匹配:在<string>中有int find(char *s),或int find(string s):找到,返回s在第一次出现的字符串数组下标,否则返回string::npos(这是一个很大的数)。
3.&&能连用:(i==1 && j==2 && k==3)。

#include <iostream>
#include <stdio.h>
#include <queue>
using namespace std;//字符串结构体
struct MaYaString{char maya[14];      //玛雅数字字符串int level;          //得到该字符串所交换的次数int exc;            //父串下标为exc和(exc+1)的字符交换得到该串
};//判断两字符串是否相同
bool isSame(char *a,char *b,int n);//判断一个字符串是否含2012
bool isHave2012(char *a,int n);//判断一个字符串是否可能移位成含有2012
bool isAble(char *a,int n);int main(){int N,i,j,answer;                //N:字符串长度,answer:交换次数char cc;queue<MaYaString *> Que;         //队列,方便广度遍历bool has2012;                    //表示2012是否已经出现while(scanf("%d",&N)!=EOF){      //输入字符串长度answer=0;                         //初始化一些变量has2012=false;MaYaString *Node1=new MaYaString;MaYaString *Node2;Node1->level=0;Node1->exc=-1;scanf("%s",Node1->maya);          //输入数字字符串if(isHave2012(Node1->maya,N)){    //输入本身已经含有2012,则直接输出printf("0\n");delete Node1;}else{                             //输入本身不含2012if(!isAble(Node1->maya,N)){         //输入不可能交换出2012printf("-1\n");delete Node1;}else{                               //输入可以交换出2012Que.push(Node1);                      //结点Node1入队while(!Que.empty()){                  //队不为空,则一直循环Node1=Que.front();                      //Node1出队Que.pop();for(i=0;i<N-1;i++){                     //循环产生Node1结点的子结点if(Node1->exc==i)                        //剪枝:不让生成和爷爷结点一样的串continue;Node2=new MaYaString;                    //子结点Node2初始化Node2->exc=i;Node2->level=(Node1->level)+1;for(j=0;j<N;j++){Node2->maya[j]=Node1->maya[j];}cc=Node2->maya[i];Node2->maya[i]=Node2->maya[i+1];Node2->maya[i+1]=cc;if(isSame(Node1->maya,Node2->maya,N)){   //剪枝:不让生成和父亲结点一样的串delete Node2;continue;}if(isHave2012(Node2->maya,N)){           //子结点Node2有2012了has2012=true;                              //表已产生答案,且记下答案answer=Node2->level;delete Node2;                              //释放所有空间while(!Que.empty()){Node2=Que.front();Que.pop();delete Node2;}break;}else{                                    //子结点Node2还没有2012,入队Que.push(Node2);}}delete Node1;                           //删除释放Node1}if(has2012){                          //已有答案printf("%d\n",answer);                  //输出答案:交换次数}}}}return 0;
}//判断两字符串是否相同
bool isSame(char *a,char *b,int n){int i;bool boo=true;for(i=0;i<n;i++){if(a[i]!=b[i]){boo=false;break;}}return boo;
}//判断一个字符串是否含2012
bool isHave2012(char *a,int n){int i;bool boo=false;if(n<4){return false;}else{for(i=0;i<=(n-4);i++){if((a[i]=='2' && a[i+1]=='0') && (a[i+2]=='1' && a[i+3]=='2')){boo=true;break;}}}return boo;
}//判断一个字符串是否可能移位成含有2012
//只要至少有2个'2',1个'0',1个'1',就可以
bool isAble(char *a,int n){int i,n0=0,n1=0,n2=0;if(n<4)return false;else{for(i=0;i<n;i++){switch(a[i]){case '0':n0++;break;case '1':n1++;break;case '2':n2++;}}if(n0>=1 && n1>=1 && n2>=2)return true;elsereturn false;}
}

清华 2012 玛雅人的密码相关推荐

  1. KY12 玛雅人的密码

    KY12 玛雅人的密码 def getSwapNum(txt):myQueue = list()myQueue.append((txt,0))while len(myQueue)>0:item ...

  2. 题目1482:玛雅人的密码

    题目描述: 玛雅人有一种密码,如果字符串中出现连续的2012四个数字就能解开密码.给一个长度为N的字符串,(2=<N<=13)该字符串中只含有0,1,2三种数字,问这个字符串要移位几次才能 ...

  3. 玛雅人的密码【清华大学】

    题目链接 BFS 不是常规的广搜,但还是没有对这种题的敏感度,凡是求最小步数什么的,都应该往广搜上考虑一下. 涨知识: pair的用法 #include<bits/stdc++.h> us ...

  4. 如果玛雅人的预言又一次实现2012年我们会怎样?

    玛雅人有5个预言,前4个都实现了,最后一个就是世界末日. 在每一纪结束时,都会上演一出惊心动魄的毁灭剧情. 第一个太阳纪是马特拉克堤利MATLACTIL ART,最后为一场洪水所灭,有一说法是诺亚的洪 ...

  5. 2012有多少人觉醒,地球将提升到第四密度(转)

    <一的法则>指出,第三密度人类的理想寿命是900年,第四密度人类的理想寿命是9万年.这几千年的人类寿命的缩短,是由于群体意识决定,由于私有制,发展金钱与权利,导致争夺和嫉妒,导致人口寿命迅 ...

  6. 清北2021毕业生就业报告出炉!清华博士0人出国,70%进体制

      视学算法报道   编辑:桃子 好困 [新智元导读]What? 2021届清华毕业生,70%进入了体制内.不仅清华博士无人再深造,还一起纷纷去当了老师.就连北大博士毕业首选也是教育行业.近日,清北发 ...

  7. 清北2021毕业生就业报告出炉 清华博士0人出国,70%进体制

    大家好,我是对白. 2021届的清华毕业生,七成进入了体制内. 不仅清华博士无人再深造,还一起纷纷去当了老师. 就连北大博士更是如此,毕业首选行业是教育. 没想到,老师成了香饽饽. 这几天,清北发布了 ...

  8. 清华北大2021毕业生就业报告出炉!清华博士0人出国,70%进体制

      转载于 新智元   编辑:桃子 好困 [新智元导读]What? 2021届清华毕业生,70%进入了体制内.不仅清华博士无人再深造,还一起纷纷去当了老师.就连北大博士毕业首选也是教育行业.近日,清北 ...

  9. 2012年新浪微博用户密码泄露漏洞

    2012年新浪微博用户密码泄露漏洞(图片解析) 相关厂商:www.sina.com 作者:http://weibo.com/evilniang 发现时间:2012-1-1 漏洞类型:sql注射 危害等 ...

最新文章

  1. LeetCode Decode String(栈和递归)
  2. Spring学习5之自动装配Bean01
  3. 区块链BaaS云服务(28)TOP Network 之P2P 网络
  4. ibm z系列服务器 cpu,低调发布:看IBM System Z系列大型机CPU
  5. 异步复位设计中的亚稳态问题及其解决方案
  6. python 倒数_【IT专家】python实现文件倒数N行读取
  7. iOS UICollectionView的简单使用和常用代理方法
  8. 【转载】快速掌握一个语言最常用的50%
  9. x光肺部分割数据集_一个超小型分割检测数据集
  10. verilog实现三人表决器
  11. Phase2 Day13 MyHashMap
  12. python whl文件安装_python whl文件怎么安装
  13. matlab五维图,一张图让你看清楚从0维到10维的终极解释
  14. 软件测试能干到多少岁,老了怎么办?
  15. 使用CKRule实现PVC配方计算
  16. http与Socket区别
  17. “智造”转型:IBM协助福耀玻璃抢占市场先机
  18. 前列腺穿刺活检技术发展
  19. SpringBoot+MDC实现链路调用日志
  20. ESP32-CAM高性价比温湿度监控系统配网与上网方案设计与实现

热门文章

  1. VMware14-15安装MAC
  2. ios Objective-c 自制相册 显示所有图片和视频 有提到解决UICollectionVIew布局混乱
  3. java公交查询系统开题报告_毕业设计论文-基于JAVA的公交查询系统的设计与实现.doc...
  4. 个人每年结汇金额为5万美金,如果超过了限额,怎么结汇?义乌个体户500万大额结汇帮你
  5. opencv3.0中contrib模块的添加
  6. 物联网区块链革命来了:这就是为什么你应该注意
  7. 当物联网遇上区块链解决了哪些问题?
  8. 《Unity虚拟现实开发实战》——第3章,第3.6节虚拟现实设备的运行原理
  9. 遨博机器人展示_遨博协作机器人全系列二:iV系列智能视觉专用插件无缝对接...
  10. RecylerView快速使用BaseQuickAdapter(BRVAH使用指南)