【BFS】瑪雅人的密碼

時間限制:1秒 空間限制:65536K 熱度指數:5412

 算法知識視頻講解

校招時部分企業筆試將禁止編程題跳出頁面,爲提前適應,練習時請使用在線自測,而非本地IDE。

題目描述

瑪雅人有一種密碼,如果字符串中出現連續的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。

示例1

輸入

5

02120

輸出

1

1. 典型的BFS題目,節點爲字符串

2. 巧妙地運用map來判斷搜索樹中是否有重複的節點

3. s.find("2012")!=string::npos 匹配字符串中的模式

#include<bits/stdc++.h>
using namespace std;
bool judge(string s){
    if(s.find("2012")!=string::npos) return true;
    return false;
}
string mySwap(string s, int i){
    char c = s[i+1];
    s[i+1] = s[i];
    s[i] = c;
    return s;
}
int main(){
    int n;
    while(cin >> n){
        string s;
        bool flag = false;
        queue<string> q;
        map<string, int> M;
        cin >> s;
        if(judge(s)){
            cout << 0 << endl;
            continue;
        }
        q.push(s);
        M[s] = 0;
        while(!q.empty()){
            string curS = q.front();
            q.pop();
            for(int i = 0; i < curS.length()-1; i++){
                string newS = mySwap(curS, i);
                if(M.count(newS) == 0){
                    M[newS] = M[curS]+1;
                    if(judge(newS)){
                        cout << M[newS] << endl;
                        flag = true;
                        break;
                    }
                    else{
                        M[newS] = M[curS]+1;
                        q.push(newS);
                    }
                }
            }
            if(flag) break;
        }
        if(!flag){
            cout << -1 << endl;
        }
    }

    return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章