九度oj 1482:玛雅人的密码
题意:输入一个长度为n(2<=n<=13)的字符串(所有字符为‘0’,‘1’或‘2’),通过交换相邻的两个字符,至少要交换多少次才能处出现字串“2012”,输出这个值,若不能则输出-1。
输入:
5
02120
输出
1
思路:bfs搜索,每个串代表一个状态,最多有3^13个状态。每一个字符串可以转换成对应的三进制数,用来标记该串是否访问过。
代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
struct node{
char str[15];
int cnt;
};
bool vis[1600000],get;
char str[15];
int n;
queue<struct node> Q;
int get_num(char temp[]){
int i,num = 0;
for(i=n-1; i>=0; i--){
num *= 3;
num += temp[i] - '0';
}
return num;
}
bool judge(char temp[]){
char sub[5];
int i;
for(i=0; i<=n-4; i++)
if(temp[i] == '2' && temp[i+1] == '0' && temp[i+2] == '1' && temp[i+3] == '2')
return true;
return false;
}
int bfs(){
for(int i=0; i<1600000; i++)
vis[i] = false;
while(!Q.empty())
Q.pop();
node sta,sta1,sta2;
for(int i=0; i<n; i++)
sta.str[i] = str[i];
sta.cnt = 0;
Q.push(sta);
while(!Q.empty()){
sta1 = Q.front();
Q.pop();
int num1 = get_num(sta1.str);
if(judge(sta1.str))
return sta1.cnt;
vis[num1] = true;
for(int i=0; i<n-1; i++){
sta2 = sta1;
sta2.cnt ++;
char ch = sta2.str[i];
sta2.str[i] = sta2.str[i+1];
sta2.str[i+1] = ch;
int num2 = get_num(sta2.str);
if(!vis[num2])
Q.push(sta2);
}
}
}
int main(){
int i,j,cnt[10];
while(cin >> n){
cin >> str;
cnt[0] = cnt[1] = cnt[2] = 0;
for(i=0; i<n; i++)
cnt[str[i] - '0'] ++;
if(cnt[0] == 0 || cnt[1] == 0 || cnt[2] < 2){
cout << -1 << endl;
continue;
}
int ans = bfs();
cout << ans << endl;
}
return 0;
}
九度oj 1482:玛雅人的密码的更多相关文章
- 【九度OJ】题目1138:进制转换 解题报告
[九度OJ]题目1138:进制转换 解题报告 标签(空格分隔): 九度OJ 原题地址:http://ac.jobdu.com/problem.php?pid=1138 题目描述: 将一个长度最多为30 ...
- 【九度OJ】题目1444:More is better 解题报告
[九度OJ]题目1444:More is better 解题报告 标签(空格分隔): 九度OJ 原题地址:http://ac.jobdu.com/problem.php?pid=1444 题目描述: ...
- 【九度OJ】题目1208:10进制 VS 2进制 解题报告
[九度OJ]题目1208:10进制 VS 2进制 解题报告 标签(空格分隔): 九度OJ 原题地址:http://ac.jobdu.com/problem.php?pid=1208 题目描述: 对于一 ...
- 九度oj 题目1087:约数的个数
题目链接:http://ac.jobdu.com/problem.php?pid=1087 题目描述: 输入n个整数,依次输出每个数的约数的个数 输入: 输入的第一行为N,即数组的个数(N<=1 ...
- 九度OJ 1502 最大值最小化(JAVA)
题目1502:最大值最小化(二分答案) 九度OJ Java import java.util.Scanner; public class Main { public static int max(in ...
- 九度OJ,题目1089:数字反转
题目描述: 12翻一下是21,34翻一下是43,12+34是46,46翻一下是64,现在又任意两个正整数,问他们两个数反转的和是否等于两个数的和的反转. 输入: 第一行一个正整数表示测试数据的个数n. ...
- 九度OJ 1500 出操队形 -- 动态规划(最长上升子序列)
题目地址:http://ac.jobdu.com/problem.php?pid=1500 题目描述: 在读高中的时候,每天早上学校都要组织全校的师生进行跑步来锻炼身体,每当出操令吹响时,大家就开始往 ...
- 九度OJ 1531 货币面值(网易游戏2013年校园招聘笔试题) -- 动态规划
题目地址:http://ac.jobdu.com/problem.php?pid=1531 题目描述: 小虎是游戏中的一个国王,在他管理的国家中发行了很多不同面额的纸币,用这些纸币进行任意的组合可以在 ...
- 九度OJ 1024 畅通工程 -- 并查集、贪心算法(最小生成树)
题目地址:http://ac.jobdu.com/problem.php?pid=1024 题目描述: 省政府"畅通工程"的目标是使全省任何两个村庄间都可以实现公路交通(但 ...
随机推荐
- [Angular 2] Using ngrx/store and Reducers for Angular 2 Application State
ngrx/store is a library that simplifies common RxJS patterns for managing state and gives you an eas ...
- 面试题 HashMap 数据结构 实现原理
数据结构 HashMap的数据结构 数据结构中有数组和链表来实现对数据的存储,但这两者基本上是两个极端. 数组:数组存储区间是连续的,占用内存严重,故空间复杂的很大.但数组的二分查找时间复杂度小,为O ...
- spring03autowire属性
1.创建需要的实体类 public class Student { //学生实体类 private String name; //姓名 private Integer age; //年龄 privat ...
- Windows Native API
http://en.wikipedia.org/wiki/Native_API Windows 的原生 API 函数通常在系统启动时(这里其他 Windows 组件还不可用).kernel32.dll ...
- 在SPItemEventReceiver中使用BeforeProperties和AfterProperties
当你利用这些事件时,就很快会发现存在前(同步)后(异步)两种事件.其方法的后缀分别为“ing”(比如,ItemAdding)和“ed”(比如,ItemAdded),分别代表了变更发生前调用和发生后调用 ...
- 注意mysql中的编码格式和php中的编码格式一致
今天发现用php代码插入英文可以,但是中文插入不进去,注意编码要一致,@mysql_connect("localhost","root","12345 ...
- 第二章 控件架构与自定义控件详解 + ListView使用技巧 + Scroll分析
1.Android控件架构下图是UI界面架构图,每个Activity都有一个Window对象,通常是由PhoneWindow类来实现的.PhoneWindow将DecorView作为整个应用窗口的根V ...
- 常用语句1【weber出品】
1.查看控制文件位置: select * from v$controlfile show parameter control; 2.查询日志文件位置 select group#,status,mem ...
- 武汉科技大学ACM:1007: 文本编辑器
Problem Description YB打算写一个功能强大的文本编辑器,并取一个炫酷拉风,高端优雅的名字,比如“YB牌文本编辑器”之类的.既然功能强大,那肯定得有个查找功能吧.但是他在完成这个功能 ...
- css样式-ime-mode text-transform
今天遇到一个新的css样式: ime-mode text-transform 有效小作用 取值:auto : 默认值.不影响ime的状态.与不指定 ime-mode 属性时相同 active : ...