九度OJ 题目1482:玛雅人的密码
2015-08-28 16:37
357 查看
一题目描述:
玛雅人有一种密码,如果字符串中出现连续的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
二.题目分析
典型的BFS应用
三.代码
一题目描述:
玛雅人有一种密码,如果字符串中出现连续的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
二.题目分析
典型的BFS应用
三.代码
#include<cstdio> #include<cstdlib> #include<cstring> #include<queue> #define MAX 1600000 using namespace std; typedef struct { int step; char s[15]; }Node; int Hash(char *str) { int i,res=0; for(i=0;str[i];i++) res=res*3+str[i]-'0'; return res; } int check(char *str) { int i; for(i=0;i<=strlen(str)-4;i++) { if(str[i]=='2'&&str[i+1]=='0'&&str[i+2]=='1'&&str[i+3]=='2') return 1; } return 0; } int swap(char *str,int i,int j) { char ch; ch=str[i]; str[i]=str[j]; str[j]=ch; } int main() { char temp[15]; queue <Node> q; int *visit,hash,i,j,flag,N,cn; visit=(int*)malloc(MAX*sizeof(int)); while(scanf("%d",&N)!=EOF) { char str[15]; flag=0; scanf("%s",str); if(N<4) { printf("-1\n"); continue; } for(i=0;i<MAX;i++) visit[i]=0; while(!q.empty()) q.pop(); hash=Hash(str); visit[hash]=1; Node node; node.step=0; strcpy(node.s,str); q.push(node); while(!q.empty()) { Node e; e=q.front(); q.pop(); cn=e.step; if(check(e.s)==1) { printf("%d\n",e.step); flag=1; break; } /* for(i=0;i<=N-2;i++) { swap(e.s,i,i+1); hash=Hash(e.s); if(!visit[hash]) { visit[hash]=1; Node temp; temp.step=cn+1; //注意此处容易出错,原来写的是temp.step=e.step+1....改了很久,才想起来,e已经变了,所以要另外设变量cn strcpy(temp.s,e.s); q.push(temp); swap(e.s,i+1,i); } else swap(e.s,i+1,i); }*/ for(i=0;i<strlen(e.s)-1;i++) { char temp[12]; for(j=0;e.s[j];j++) temp[j]=e.s[j]; temp[j]='\0'; swap(temp,i,i+1); hash=Hash(temp); if(!visit[hash]) { //put into queue visit[hash]=1; Node tn; strcpy(tn.s,temp); tn.step=e.step+1; q.push(tn); } } } if(!flag) printf("-1\n"); } return 0; }
相关文章推荐
- 如何看懂ORACLE执行计划
- Hadoop相关日常操作
- zzuli OJ 1062: 最大公约数
- C/C++_中NULL与空字符串的区别
- hdu 5326
- 1027. Colors in Mars (20)
- SQLQuery
- muduo网络库源码学习————Timestamp.cc
- Eclipse新导入web项目run on server
- 使用了Autolayout的UITableViewCell动态布局和高度动态改变自适应
- 【system】Findbugs静态分析工具插件安装
- swift tutorial 2---你的第一个项目
- cocos2d js 中TableView
- Hadoop相关日常操作
- 推荐一款基于XNA的开源游戏引擎《Engine Nine》
- win8.1/win10 UEFI + GPT 安装(测试机型:华硕S56CM)
- [UVA1149]Dominating Patterns
- iOS开发之多线程(GCD介绍)
- sql 中英文格式的时间转数字格式
- 8个超实用的Java测试工具和框架