题目描述:

玛雅人有一种密码,如果字符串中出现连续的2012四个数字就能解开密码。给一个长度为N的字符串,(2=<N<=13)该字符串中只含有0,1,2三种数字,问这个字符串要移位几次才能解开密码,每次只能移动相邻的两个数字。例如02120经过一次移位,可以得到20120,01220,02210,02102,其中20120符合要求,因此输出为1.如果无论移位多少次都解不开密码,输出-1。

输入:

输入包含多组测试数据,每组测试数据由两行组成。
第一行为一个整数N,代表字符串的长度(2<=N<=13)。
第二行为一个仅由0、1、2组成的,长度为N的字符串。

输出:

对于每组测试数据,若可以解出密码,输出最少的移位次数;否则输出-1。

样例输入:
5
02120
样例输出:
1

这个题第一眼看上去好像不难,但做起来却不知道如何下手。一开始思路往动态规划上靠,可是状态转移方程真实难以想明白。
想了很久,实在是想不明白,只好翻了翻别人的题解,这才知道原来是用广度优先搜索来做。
一道题找对方法真的很重要。 那么搜索时状态即为字符串的排列情况,利用map来记录该状态是否被访问过。检查每一个状态是否符合要求,一旦符合,就是最小的次数。 代码如下
 #include <cstdio>
#include <cstring>
#include <iostream>
#include <string>
#include <map>
#include <queue> using namespace std;
int cnt[];
typedef pair<string, int> Node;
map <string, int> mapping; string str;
queue <Node> que; bool isOk(string s) {
int len = s.size();
for (int i = ; i <= len-; i++) {
if (s[i] == '' && s[i + ] == '' && s[i + ] == '' && s[i + ] == '') {
return true;
}
}
return false;
} int main() {
int n;
while (scanf("%d", &n) != EOF) {
cin >> str;
int len = str.size();
memset(cnt, , sizeof(cnt));
for (int i = ; i < len; i++) {
cnt[str[i] - '']++;
}
if (cnt[] < || cnt[] < || cnt[] < ) {
puts("-1");
continue;
}
while (!que.empty()) {
que.pop();
}
mapping.clear();
mapping[str] = ;
que.push(Node(str, ));
int ans = -;
while (!que.empty()) {
Node p = que.front(); que.pop();
string t = p.first;
int step = p.second;
if (isOk(t)) {
ans = step;
break;
}
for (int i = ; i+ < len; i++) {
string tmp = t;
swap(tmp[i], tmp[i + ]);
if (mapping.find(tmp) == mapping.end()) {
mapping[tmp] = ;
que.push(Node(tmp, step + ));
}
} }
printf("%d\n", ans); }
return ;
}

这种题题面很简单,做起来代码其实也很简单,但就是想不到该用什么样的方法,但一旦找对方法,问题就迎刃而解了

九度oj 题目1482:玛雅人的密码 清华大学机试的更多相关文章

  1. 九度oj题目&amp;吉大考研11年机试题全解

    九度oj题目(吉大考研11年机试题全解) 吉大考研机试2011年题目: 题目一(jobdu1105:字符串的反码).    http://ac.jobdu.com/problem.php?pid=11 ...

  2. 九度oj题目&amp;吉大考研10年机试题全解

    吉大考研机试2010年题目 题目一(jobdu1478:三角形的边).    http://ac.jobdu.com/problem.php?pid=1478 给出三个正整数,计算最小的数加上次小的数 ...

  3. 九度OJ 题目1384:二维数组中的查找

    /********************************* * 日期:2013-10-11 * 作者:SJF0115 * 题号: 九度OJ 题目1384:二维数组中的查找 * 来源:http ...

  4. hdu 1284 关于钱币兑换的一系列问题 九度oj 题目1408:吃豆机器人

    钱币兑换问题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Sub ...

  5. 九度oj 题目1007:奥运排序问题

    九度oj 题目1007:奥运排序问题   恢复 题目描述: 按要求,给国家进行排名. 输入:                        有多组数据. 第一行给出国家数N,要求排名的国家数M,国家号 ...

  6. 九度oj 题目1087:约数的个数

    题目链接:http://ac.jobdu.com/problem.php?pid=1087 题目描述: 输入n个整数,依次输出每个数的约数的个数 输入: 输入的第一行为N,即数组的个数(N<=1 ...

  7. 九度OJ题目1105:字符串的反码

    tips:scanf,cin输入字符串遇到空格就停止,所以想输入一行字符并保留最后的"\0"还是用gets()函数比较好,九度OJ真操蛋,true?没有这个关键字,还是用1吧,还是 ...

  8. 九度oj题目1009:二叉搜索树

    题目描述: 判断两序列是否为同一二叉搜索树序列 输入:                        开始一个数n,(1<=n<=20) 表示有n个需要判断,n= 0 的时候输入结束. 接 ...

  9. 九度oj题目1002:Grading

    //不是说C语言就是C++的子集么,为毛printf在九度OJ上不能通过编译,abs还不支持参数为整型的abs()重载 //C++比较正确的做法是#include<cmath.h>,cou ...

随机推荐

  1. 【Windows 10 v1703】解决桌面出现Removable Storage Devices的问题

    症状如下: 右键没有正常菜单,不能查看属性. 不能通过文件树找到这个文件夹. 出现原因不明. 暂时的解决方案: 右键,新建一个快捷方式.然后将快捷方式拖进垃圾桶,删除.这个文件夹将会被连带删除. 感谢 ...

  2. [视觉] 基于YoloV3的实时摄像头记牌器

    基于YoloV3的实时摄像头记牌器 github:https://github.com/aoru45/cards_recognition_recorder_pytorch 最终效果 数据准备 数据获取 ...

  3. 【转】iOS学习笔记(十七)——文件操作(NSFileManager)

    iOS的沙盒机制,应用只能访问自己应用目录下的文件.iOS不像android,没有SD卡概念,不能直接访问图像.视频等内容.iOS应用产生的内容,如图像.文件.缓存内容等都必须存储在自己的沙盒内.默认 ...

  4. JavaScript实用的例子

    ---恢复内容开始--- 1.发送验证码 <input id="send" type="button" value="发送验证码"&g ...

  5. springmvc的第一个程序

    文中用的框架版本:spring 3,hibernate 3,没有的,自己上网下. web.xml配置: <?xml version="1.0" encoding=" ...

  6. 因 URL 意外地以“/HelloWorld”结束,请求格式无法识别。

    web.config文件中的 <system.web> 节点下加入:<webServices>    <protocols>        <add name ...

  7. 廖老师JavaScript教程高阶函数-sort用法

    先来学习一个新词:高阶函数 高阶函数英文叫Higher-order function.那么什么是高阶函数? JavaScript的函数其实都指向某个变量.既然变量可以指向函数,函数的参数能接收变量,那 ...

  8. python面向对象之抽象工厂设计模式

    class truck: def use(self): return "拉货" def __str__(self): return "大卡车" class mi ...

  9. 【Ubuntu】ubuntu基本操作命令

    本文主要是用于记录ubuntu中会使用到的命令,但是有不是特别常用的,用于自己后续查阅使用. 1.查询ubuntu版本信息 方法一: cat /etc/issue 方法二: sudo lsb_rele ...

  10. python入门:in 的用法(它在不在这个字符串里面)

    #!/usr/bin/env python # -*- coding:utf-8 -*- #in 的用法(它在不在这个字符串里面) #ret(返回,译音:ruai特) #给s赋值为字符串“Alex S ...