密码锁

题目描述

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

输入

第一行输入N,第二行输入N个数字,只包含0,1,2

输出

输出最少移动次数或者-1

样例输入

5
02120
5
02120

样例输出

1
1

代码

#include <stdio.h>
#include <iostream>
#include <map>
#include <string>
#include <queue>
using namespace std;
map<string, int> M;
queue<string> Q;
  
string Swap(string str, int i)
{
    string newStr=str;
    char tmp=newStr[i];
    newStr[i]=newStr[i+1];
    newStr[i+1]=tmp;
    return newStr;
}
  
bool Judge(string str)
{
    if(str.find("2012", 0)==string::npos) return false;
    else return true;
}
  
int BFS(string str)
{
    string newStr;
    M.clear();
    while(!Q.empty()) Q.pop();
    Q.push(str);
    M[str]=0;
    while(!Q.empty())
    {
        str=Q.front();
        Q.pop();
        for(unsigned i=0; i<str.size()-1; i++)
        {
            newStr=Swap(str, i);
            if(M.find(newStr)==M.end())
            {
                M[newStr]=M[str]+1;
                if(Judge(newStr)==true) return M[newStr];
                else Q.push(newStr);
            }
            else continue;
        }
    }
    return -1;
}
  
int main()
{
    int n;
    string str;
    while(scanf("%d", &n)!=EOF)
    {
        cin>>str;
        if(Judge(str)==true) printf("0\n");
        else
        {
            int ans=BFS(str);
            printf("%d\n", ans);
        }
    }
    return 0;
}
全部评论

相关推荐

totoroyyw:千年老妖😂
投递华为等公司10个岗位
点赞 评论 收藏
分享
10-11 17:45
门头沟学院 Java
走吗:别怕 我以前也是这么认为 虽然一面就挂 但是颇有收获!
点赞 评论 收藏
分享
服从性笔试吗,发这么多笔,现在还在发。
蟑螂恶霸zZ:傻 x 公司,发两次笔试,两次部门匹配挂,
投递金山WPS等公司10个岗位 >
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务