清華大學研究生機試題目-瑪雅人的密碼
阿新 • • 發佈:2018-11-02
題目描述
瑪雅人有一種密碼,如果字串中出現連續的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; } }