题目描述:

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

思路

1. 朴素 BFS 可解

2. 看了下题目来源, 2012 清华机试, 唔, 模拟, 数学, 动规, 三题一个小时. 当你考清华一同学向我描述清华的的机试状况.

代码

#include <iostream>
#include <stdio.h>
#include <string>
#include <math.h>
#include <deque>
#include <memory.h>
using namespace std; string str;
int N; bool visited[]; bool match(const string &str1) { for(int i = ; i <= N-; i ++) {
if(str1.substr(i, ) == "")
return true;
}
return false;
} int hash_func() {
int res = ;
for(int i = ; i < N; i ++)
res = res*+str[i]-'';
return res;
} int main() {
while(scanf("%d", &N) != EOF) {
cin >> str;
memset(visited, , sizeof(visited)); deque<string> record;
record.push_back(str);
int cur_lel = , nxt_lel = , ret = ;
bool found = false; while(!record.empty()) {
string cur = record.front();
record.pop_front();
cur_lel --; if(match(cur)) {
found = true;
cout << ret << endl;
break;
} for(int i = ; i < N-; i ++) {
swap(str[i], str[i+]);
int hash_val = hash_func();
if(!visited[hash_val]) {
visited[hash_val] = true;
record.push_back(str);
nxt_lel ++;
}
swap(str[i], str[i+]);
} if(cur_lel == ) {
cur_lel = nxt_lel;
nxt_lel = ;
ret ++;
} }
if(!found)
cout << - << endl;
}
return ;
}

九度 1482:玛雅人的密码(BFS)的更多相关文章

  1. 九度oj 题目1482:玛雅人的密码 清华大学机试

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

  2. 九度oj 1482:玛雅人的密码

    题意:输入一个长度为n(2<=n<=13)的字符串(所有字符为'0','1'或'2'),通过交换相邻的两个字符,至少要交换多少次才能处出现字串"2012",输出这个值, ...

  3. 九度1456胜利大逃亡【BFS】

    时间限制:1 秒 内存限制:128 兆 特殊判题:否 提交:4432 解决:1616 题目描述: Ignatius被魔王抓走了,有一天魔王出差去了,这可是Ignatius逃亡的好机会.魔王住在一个城堡 ...

  4. 九度OJ 1127:简单密码 (翻译)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:1218 解决:721 题目描述: Julius Caesar曾经使用过一种很简单的密码. 对于明文中的每个字符,将它用它字母表中后5位对应的 ...

  5. 九度OJ1450题-产生冠军-MAP的使用

    题目1450:产生冠军 时间限制:1 秒 内存限制:128 兆 特殊判题:否 提交:2839 解决:1161 题目描述: 有一群人,打乒乓球比赛,两两捉对撕杀,每两个人之间最多打一场比赛.球赛的规则如 ...

  6. 剑指Offer - 九度1360 - 乐透之猜数游戏

    剑指Offer - 九度1360 - 乐透之猜数游戏2014-02-05 19:54 题目描述: 六一儿童节到了,YZ买了很多丰厚的礼品,准备奖励给JOBDU里辛劳的员工.为了增添一点趣味性,他还准备 ...

  7. 剑指Offer - 九度1523 - 从上往下打印二叉树

    剑指Offer - 九度1523 - 从上往下打印二叉树2013-12-01 00:35 题目描述: 从上往下打印出二叉树的每个节点,同层节点从左至右打印. 输入: 输入可能包含多个测试样例,输入以E ...

  8. 剑指Offer - 九度1514 - 数值的整数次方

    剑指Offer - 九度1514 - 数值的整数次方2013-11-30 00:49 题目描述: 给定一个double类型的浮点数base和int类型的整数exponent.求base的exponen ...

  9. 剑指Offer - 九度1511 - 从尾到头打印链表

    剑指Offer - 九度1511 - 从尾到头打印链表2013-11-29 21:08 题目描述: 输入一个链表,从尾到头打印链表每个节点的值. 输入: 每个输入文件仅包含一组测试样例.每一组测试案例 ...

随机推荐

  1. linux下安装jre运行环境

    上官网下载安装文件:点击打开链接 文件名:jre-8u65-linux-x64.gz安装步骤1.解压tar -xzvf jre-8u65-linux-x64.gz2.将解压后的文件放到/usr/lib ...

  2. 想做web开发 就学JavaScript

    有一天我被问到,为了快速地在 web 开发工作上增加优势,应该学习什么语言.我的思绪回到了大学,那时候我用 Pascal.Fortran.C和汇编语言,不过那个时候有不同的目标. 鉴于当前的状况和趋势 ...

  3. Numpy 的通用函数:快速的元素级数组函数

    通用函数: 通用函数(ufunc)是一种对ndarray中的数据执行元素级运算的函数.你可以将其看作简单函数(接受一个或多个标量值,并产生一个或度过标量值)的矢量化包装器. 简单的元素级变体,如sqr ...

  4. 【转】【Python】 python中的编码问题报错 'ascii' codec can't decode 及 URL地址获取中文

    1.unicode.gbk.gb2312.utf-8的关系 http://www.pythonclub.org/python-basic/encode-detail 这篇文章写的比较好,utf-8是u ...

  5. VIM下的普通模式的相关知识

    什么为一次操作? 从进行插入模式开始,直到返回普通模式为止,在此期间的任何修改都视为一次操作:   使用 u 可以撤销最新的修改: 所以呢,控制好在插入模式的操作就可以控制好撤销命令的粒度: 另外,最 ...

  6. Linux命令_磁盘管理_查看磁盘或目录的容量

    软件环境:虚拟机VM12,Linux版本 CentOS 7.3 命令 df (disk filesystem) 用于查看已挂载磁盘的总容量.使用容量.剩余容量等,可以不加任何参数,默认以KB为单位显示 ...

  7. 解决Eclipse代码分析插件SonarLint在Console输出乱码问题

    在Eclipse安装目录下的eclipse.ini文件末尾加上一行   -Dfile.encoding=UTF-8   即可.

  8. Java与编码问题串讲之二–如何理解java采用Unicode编码

    Java开发者必须牢记:在Java中字符仅以一种形式存在,那就是Unicode(不选择任何特定的编码,直接使用他们在字符集中的编号,这是统一的唯一方法).由于java采用unicode编码,char  ...

  9. char* 与 char[] 的区别

    "Hello world"作为静态字符串实际上存储在数据区,但写程序的人不知道这个地址,而程序本身知道.当某一函数以{ char p[] = "Hello world&q ...

  10. 由“如何取得CPU的温度与型号”学到的知识延伸WQL

    [Base]:WMI是一项核心的 Windows 管理技术:用户可以使用 WMI 管理本地和远程计算机.WQL就是 WMI 中的查询语言,翻译成中文好像可以成为 Windows 管理规范查询语言. 1 ...