题目描述:

玛雅人有一种密码,如果字符串中出现连续的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 ;
}

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

最新文章

  1. [LeetCode] Maximum Depth of Binary Tree 二叉树的最大深度
  2. Json——js和C#对Json的操作
  3. java连接mysql(二)
  4. K-均值聚类及其在生物信息中的应用
  5. Spark:Master High Availability(HA)高可用配置的2种实现
  6. POJ 2049 Finding Nemo
  7. mysql中随机取出几条数据
  8. Servlet乘法表学习笔记
  9. CAP 介绍及使用【视频】
  10. 专用管理连接(DAC)和单用户模式
  11. XML相关知识
  12. [HAOI2008]移动玩具
  13. matlab学习(1)strsplit与strtok
  14. 【转】WINS服务器与DNS服务器有什么区别?
  15. Hibernate中得fetch
  16. Linux wc
  17. python接口自动化24-有token的接口项目使用unittest框架设计
  18. 学习 Linux_kernel_exploits 小记
  19. rest_framework之魔法类
  20. python3-开发面试题(python)6.23基础篇(2)

热门文章

  1. LR脚本示例之URL请求(post、get)
  2. ssh免密登录配置方法
  3. 网站被K怎么办?
  4. Spring boot 配置异步处理执行器
  5. DROP GROUP - 删除一个用户组
  6. Unity调用Windows窗口句柄,选择文件和目录
  7. PAT (Basic Level) Practise (中文)- 1008. 数组元素循环右移问题 (20)
  8. 01_2_Namespace命名空间
  9. sql 经典加强巩固练习题
  10. Java使用ResourceBundle类读取properties文件中文乱码的解决方案