Faith


私信TA

用户名:1310510120

访问量:42367

签 名:

求介绍工作

等  级
排  名 217
经  验 6351
参赛次数 1
文章发表 54
年  龄 0
在职情况 学生
学  校 武汉生物工程学院
专  业

  自我简介:

解题思路:
定义一个hashmap来存放状态,key代表状态字符串,value代表到key状态所用的最小步数 

定义一个队列,
从队列中抛出字符串,然后遍历.和其他交换并且存入map,队列中,直到与结束字符串相等,统计步数。


注意事项:

判断开始字符串和最后字符串是否相同的时候,不能用“==”要用equals,因为是两个不同的对象引用。
这个代码是看别人的,我有几个问题,希望知道的同学可以和我交流一下。
1.为什么放在构造函数里就没有问题,放在主函数里就错了

2.判断条件是只要到了结束字符串就可以赋值。hashmap的value为什么输出的是最小步数,
写的不好请见谅。

参考代码:

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

public class 九宫重排 {
	public static void main(String[] args) {
	Scanner in=new Scanner (System.in);
	String s=in.nextLine();//开始字符串
	String l=in.nextLine();//结束字符串
	HashMap<String,Integer> map=new HashMap<String,Integer>(); 
	 //用于保存之前状态,key代表状态字符串,value代表到key状态所用的最小步数 
	Queue<String> process = new LinkedList<String>();//bfs用到的队列  
	map.put(f,0);
	process.offer(f);
	int result=-1;
	
	while(result==-1){
	String cur=process.poll();
	int temp=cur.indexOf(".");
	int d[]={-3,3,-1,1};//代表上下左右
	for(int i=0;i<=3;i++){
		
		int p=temp+d[i];

		if(p<=8&&p>=0&&(p%3==temp%3||p/3==temp/3)){
		//012345678九宫格上2和3不能交换,要排除
			String change=cur.replace('.','*');/交换String中的两个字符,借助中间字符‘*’  
			change =change.replace(cur.charAt(p),'.');
			change =change.replace('*',cur.charAt(p));
			if(change.equals(l)){
				result=map.get(cur)+1;
			}
			if(!map.containsKey(change)){//如果之前没有这种状态  
				map.put(change,map.get(cur)+1);
				process.add(change);//存入队列 ,先进先出 
			}
		}
	}
		
	}
	System.out.println(result);
	}	
	

}	


 

0.0分

0 人评分

  评论区

第一个问题没看懂。。你代码里没有构造函数啊?
第二个问题 因为 bfs 遍历就是寻找小方案的 ,可以借助解空间树理解。最小解在最小层。
2020-02-21 20:02:54
代码里有2个小问题
1.   15,16行里的f应该是s
2.    最后输出的是l的value值,所以输出语句为:
 System.out.println(map.get(l));
2018-11-10 01:21:08
  • «
  • 1
  • »