标题:九宫重排

    如图1的九宫格中,放着 1~8 的数字卡片,还有一个格子空着。与空格子相邻的格子中的卡片可以移动到空格中。经过若干次移动,可以形成图2所示的局面。

    我们把图1的局面记为:12345678.
    把图2的局面记为:123.46758

    显然是按从上到下,从左到右的顺序记录数字,空格记为句点。

    本题目的任务是已知九宫的初态和终态,求最少经过多少步的移动可以到达。如果无论多少步都无法到达,则输出-1。

例如:
输入数据为:
12345678.
123.46758
则,程序应该输出:
3

再如:
输入:
13524678.
46758123.
则,程序输出:
22

资源约定:
峰值内存消耗(含虚拟机) < 64M

 

CPU消耗  < 2000ms

 

bfs搜索的一道非常典型题目,写得有点啰嗦!!

 

/**
 * 
 */
package D1;

import java.util.HashSet;
import java.util.Scanner;
import java.util.Queue;
import java.util.LinkedList;
import java.util.Set;

/**
 * @作者: gx_143
 * @创建时间: 2017-5-19上午11:31:28
 */
public class T8 {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc=new Scanner(System.in);
		String str=sc.nextLine();
		String stop=sc.nextLine();
		stop=stop.substring(0,3)+"@"+stop.substring(3,6)+"@"+stop.substring(6,9);
		//System.out.println(stop);
		char[] begin=new char[11];
		int index=0,X=0;
		for (int i = 0; i < begin.length; i++) {
			if(i==3||i==7){
				begin[i]='@';
			}else{
				begin[i]=str.charAt(index);
				index++;
				if(begin[i]=='.'){
					X=i;
				}
			}
		}
		f(begin,stop,X);
	}

	/**
	 * @param begin
	 * @param stop
	 * @param x
	 */
	static int[] fx=new int[]{1,-1,4,-4};
	private static void f(char[] begin, String stop, int x) {
		
		Queue<Node> queue=new LinkedList<Node>();
		Node node=new Node(begin,x,0);
		Set testSet = new HashSet();
		
		String start1=new String(begin);
		queue.add(node);
		testSet.add(start1);
		
		while(!queue.isEmpty()){
			Node notNode=queue.poll();
			char[] ch=notNode.ch;
			int xnext=notNode.x;
			int sum=notNode.sum;
			
			for (int i = 0; i < fx.length; i++) {
				int next=xnext+fx[i];
				
				if(next>=0&&next<11&&next!=3&&next!=7){
					
					char[] cc=new char[11];
					for (int j = 0; j < cc.length; j++) {
						cc[j]=ch[j];
					}
					
					char t=cc[xnext];
					cc[xnext]=cc[next];
					cc[next]=t;
					
					String sta=new String(cc);
					int size1=testSet.size();
					testSet.add(sta);
					int size2=testSet.size();
					
					if(size1!=size2){
						Node newNode=new Node(cc,next,sum+1);
						queue.add(newNode);	
					}
				}
			}
			String start=new String(ch);
			//System.out.println(start);
			if(start.equals(stop)){
				System.out.println(sum);
				return;
			}
		}
	}
	
	public static class Node{
		public char[] ch;
		public int x;
		public int sum;
		public Node(char[] ch,int x,int sum){
			this.ch=ch;
			this.x=x;
			this.sum=sum;
		}
	}
}