九宫重排 BFS

题目:
问题 1426: [蓝桥杯][历届试题]九宫重排
时间限制: 1Sec 内存限制: 128MB 提交: 568 解决: 118

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

我们把第一个图的局面记为:12345678.
把第二个图的局面记为:123.46758
显然是按从上到下,从左到右的顺序记录数字,空格记为句点。
本题目的任务是已知九宫的初态和终态,求最少经过多少步的移动可以到达。如果无论多少步都无法到达,则输出-1。
输入
输入第一行包含九宫的初态,第二行包含九宫的终态。
输出
输出最少的步数,如果不存在方案,则输出-1。
样例输入
12345678.
123.46758
样例输出
3

思路:输入的字符串为开头,由于此可以上下左右进行移动,则每移动一次就要交换一次。我们可以定义一个Map集合来进行存储数据,其Key的值为字符串,其Value为数字
Key的意思为从初始字符串演变到现在的字符串,Value为演变的步骤需要几步
利用队列将每一个集合里面的Key的值存入进队列中。

AC代码:

//利用BFS将其每一种情况进行列举,每一种情况再进行读取
public class C1426 {
	public static void main(String args[]) {
		Scanner sc = new Scanner(System.in);
		String start = sc.nextLine();
		String fin = sc.nextLine();
		Map map = new HashMap();//存字符串和从初始状态演变到现在的字符串的状态需要几步。
		ArrayList al = new ArrayList();//队列
		map.put(start, 0);//从一开始到当前字符串的步数为
		al.add(start);
		int result=-1;
		int[] dex= {3,-3,-1,1};//下,上,左,右
		while(result==-1&&!al.isEmpty()) {
			String temp=al.remove(0);
			int ant = temp.indexOf('.');
			for(int i=0;i<4;i++) {
				int a = ant+dex[i];
				if(a<0||a>8||Math.abs(ant%3-a%3)==2)//当其区间为一的时候则表示他们在同一行,如果不在同一行则不可以进行互换。
					continue;
				//字符串.与要移动的数值之间的交换
				String str=temp.replace(temp.charAt(a), '*');
				str=str.replace('.', temp.charAt(a));
				str=str.replace('*', '.');
				if(!map.containsKey(str)) {//判断这个字符串是否存在,存在的话则不存。
					map.put(str, map.get(temp)+1);//下一步
					al.add(str);
					if(str.equals(fin)) {
						result=1;
						break;
					}
				}
			}
		}
		if(result==-1) {
			System.out.println(-1);
		}
		else System.out.println(map.get(fin));
		
	}
}

你可能感兴趣的:(java)