java_day11
目标:Java web开发
题目:复原格子
import java.util.*;
//这里面包含了
//HashMap,HashTable,TreeMap
// ArrayList、LinkedList,Vector
// HashSet,LinkedHashSet,TreeSet
class Main {
static Scanner sc=new Scanner(System.in);
static StringBuilder sb=new StringBuilder();
//或者 static StringBuffer sb=new StringBuffer();线程安全,较慢
static int[] dx={-1,1,0,0},dy={0,0,-1,1};
public static void main(String[] args){
for (int i=0;i<9;++i) sb.append(sc.next());//sc.next()读取字符串,到空格停止
String state="12345678x";
int n=3;
LinkedList<String> q=new LinkedList<>();
//还可以写Queue<String> q=new LinkedList<>();多态性
HashSet<String> v=new HashSet<>();
/*
HashSet集合不允许有重复的元素
add() 增加一个元素
size() 返回Set集合中的元素个数
clear() 清除所有的元素
isEmpty() 如果不包含元素,则返回 true ,否则返回false
contains() 如果包含指定的元素,则返回 true,否则返回false
*/
q.offer(sb.toString());//StringBuilder转化为String
v.add(sb.toString());
int cnt=0;
while(!q.isEmpty()) {
int size=q.size();
for (int i=0;i<size;++i) {
String cur=q.poll();//获取元素并从原队列中删除,不移除的话用peek()
if(state.equals(cur)){
System.out.println(cnt);
return;
}
int j=0;
while(cur.charAt(j)!='x') j++;
int x=j/3,y=j%3;
for (int k=0;k<dx.length;++k) {//数组类中有length属性
int xx=x+dx[k],yy=y+dy[k];
if(xx<0||xx>=3||yy<0||yy>=3) continue;
int d=xx*3+yy;
char[] chs=cur.toCharArray();
char tmp=chs[j] ;
chs[j]=chs[d];
chs[d]=tmp;
String next=new String(chs);
if(!v.add(next)) continue;
//用if(v.contains(next))会超时
q.offer(next);//插入队列
}
}
cnt++;
}
System.out.println(-1);
}
}