宽度优先搜索,这道题还需要再好好吃透。
package 机试;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashSet;
import java.util.LinkedList;
public class D3_23_4 {
public static class Data {
String str;
int time;
public Data(String str, int time) {
this.str = str;
this.time = time;
}
}
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
String line;
while((line=br.readLine())!=null)
{
int n=Integer.valueOf(line);
String str=br.readLine();
System.out.println(BFS(n,str));
}
br.close();
}
private static int BFS(int n, String str) {
// TODO Auto-generated method stub
LinkedList <Data> list=new LinkedList<>();
HashSet<String> set = new HashSet<>();
if(isContain(str))
{
return 0;
}
else
{
list.add(new Data(str,0));
set.add(str);
}
Data cur;
String next;
int times;
while(!list.isEmpty())
{
cur=list.poll();
times=cur.time;
for(int i=0;i<n-1;i++)
{
if (cur.str.charAt(i) != cur.str.charAt(i + 1)) {
next = swapString(i, cur.str);
if (isContain(next)) {
return times + 1;
}
if(!set.contains(next))
{
set.add(next);
list.add(new Data(next,times+1));}
}
}
}
return -1;
}
private static String swapString(int i, String str) {
// TODO Auto-generated method stub
char[] chs = str.toCharArray();
char c = chs[i];
chs[i] = chs[i + 1];
chs[i + 1] = c;
return new String(chs);
}
private static boolean isContain(String str) {
// TODO Auto-generated method stub
char[] chs = str.toCharArray();
for (int i = 0; i + 3 < str.length(); i++) {
if (chs[i] == '2' && chs[i + 1] == '0' && chs[i + 2] == '1' && chs[i + 3] == '2') {
return true;
}
}
return false;
}
}