1. 程式人生 > >清華大學研究生機試題目-瑪雅人的密碼

清華大學研究生機試題目-瑪雅人的密碼

題目描述

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

解題思路,直接暴力窮舉,注意此處的暴力範圍。

import java.util.*;
public class Main {
    public static void main(String args[]){
        Scanner in=new Scanner(System.in);
        while(in.hasNext()){
            int N=in.nextInt();
            String sc=in.nextLine();
            String str=in.nextLine();
            if(!f1(str)){
                System.out.println(-1);   // 判斷是否有可能出現2012,如果不可能則直接返回-1
            }
           else{
                Queue queue=new LinkedList<Node>();
                Node temp=new Node(0,str);
                queue.offer(temp);
                Map map=new HashMap<String,Integer>();
                while(!queue.isEmpty()){
                    Node tempnode=(Node)queue.poll();
                    map.put(tempnode.str,1); //標記該序列
                    if(tempnode.str.indexOf("2012")>=0){
                        System.out.println(tempnode.step);
                        break;
                    }else{
                        for(int i=0;i<tempnode.str.length()-1;i++){
                            char ch[]=tempnode.str.toCharArray();
                            char tempch=ch[i];
                            ch[i]=ch[i+1];
                            ch[i+1]=tempch;
                            if(!map.containsKey(String.valueOf(ch))){ // 檢視該序列是否已經被訪問
                                queue.offer(new Node(tempnode.step+1,String.valueOf(ch)));   //將未被訪問的序列放入佇列
                                map.put(String.valueOf(ch),1);  // 標記該佇列
                            }
                        }
                    }
                }
            }
        }
    }
    //先進行預判斷是否有可能出現2012欄位
    public static boolean f1(String str){
        char ch[]=str.toCharArray();
        int cnt[]=new int[3];
        for(int i=0;i<3;i++){
            cnt[i]=0;
        }
        for(int i=0;i<str.length();i++){
            cnt[ch[i]-'0']++;
        }
        for(int i=0;i<3;i++){
            if(cnt[i]==0)
                return false;
        }
        return true;
    }
}
class Node{  //該資料結構用於儲存形成某一種形式的字串和其所需要的步數
    int step;
    String str;
    Node(int step,String str){
        this.step=step;
        this.str=str;
    }
}