java九宫拼图(带广度搜索,可提示行走步骤)

    这个版本加入了广度搜索人工智能,可以提示步骤,要是愿意的话,一直点提示,他会帮助走完拼图。基础的设计步骤在上一篇文章中。

  具体思路是:在上个版本中实现算出最短步数,但是并没有加以应用。此版本利用算出步数的广度搜索,在找到白块,模拟有效移动一次,再判断这次的局面,相比较之前最短步数是否减1。若是,则为最佳走法,若不是,则还原,再模拟一次另一个走法。其中必然有正解。伪代码如下:

数组c记录移动之前的局面;

 while (true) {
                while(不是有效白块移动) {
        移动白块       
        }
                  获得表示当前局面的字符串;
      计算最短路径d;    
           if(最短路径d相比较之前最短步数d0减1)
           { 
 用记录数组c还原移动之前局面;
        break;         
          }
           if(模拟之前局面最短步数d0==1)
                   { 
                              用记录数组c还原移动之前局面;
                break;                 
                  }
           else 
           {
          用记录数组c还原移动之前局面;           
           }                         
}

具体代码如下(改下图片的位置后可以直接执行)

 

package 拼图;
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.GridLayout;
import java.awt.Image;
import java.awt.MediaTracker;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.image.BufferedImage;
import java.awt.image.CropImageFilter;
import java.awt.image.FilteredImageSource;
import java.awt.image.ImageFilter;
import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;

import javax.imageio.ImageIO;
import javax.swing.*;
class Palace{                           //算出最短步数
	String start;//初始字符串
	String end;//目标字符串
	int result=-1;//最终结果
	public int Palacea(String shuju){
		this.start = shuju;
		end = "12345678.";
		HashMap<String, Integer> memery = new HashMap<>(100000);//用于保存之前状态,key代表状态字符串,value代表到key状态所用的最小步数
		Queue<String> process = new LinkedList<String>();//bfs用到的队列
		memery.put(start,0);//放入初始字符串
		process.offer(start);//放入初始字符串
		while(result==-1){//当没有搜索到结果是继续搜索
			String cur = process.poll();
			char[] a=cur.toCharArray();
		/*	int count=0;
			for(int b=0;b<a.length;b++) {
				count++;
				System.out.print(a[b]+"  ");
				if(count%3==0)System.out.println();
				}*/
			System.out.println("搜索中....");			
			int tmp = 0;
			while(cur.charAt(tmp)!='.'){
				tmp++;
			}						
			int[] d = {-3,3,-1,1};//方向数组,分别表示上下左右
			for(int i=0;i<4;i++){
				int p = tmp+d[i];
				int chengji = tmp*p;
				if(p>-1&&p<9&&chengji!=6&&chengji!=30){        //2-->3,3-->2,5-->6,6-->5跨行了,要去掉
					String change = cur;
					char c = cur.charAt(p);
					change = cur.replace('.', '*');//交换String中的两个字符,借助中间字符‘*’
					change = change.replace(c,'.');
					change = change.replace('*',c);
					if(change.equals(end)){//找到了目标状态					
						result = memery.get(cur)+1;
					}
					if(!memery.containsKey(change)){//如果之前没有这种状态
						memery.put(change,memery.get(cur)+1);
						process.add(change);//存入队列
					}
				}
			}
		}
		System.out.println("搜索成功");
       return result;
	}
}
class tu extends JButton {

int ID;
int nowID;
 int IMAGEWIDTH;
 int IMAGEHEIGHT;
int nowx;
int nowy;
Icon icon;
public tu(Icon icon) {
	this.setIcon(icon);
}
public tu(Icon icon, int id, int imagewidth, int height,int nowx,int nowy,int nowid)//构造函数初始化,传入两个参数,一个是图像的图标,一个是该按钮的数组ID
{
	this.setIcon(icon);
    this.ID = id;
    this.nowID = nowid;
    this.IMAGEWIDTH = imagewidth;
    this.IMAGEHEIGHT = height;
    this.setSize(IMAGEWIDTH, IMAGEHEIGHT);
    this.nowx=nowx;
    this.nowy=nowy;
    this.icon=icon;    
}
public Icon geticon() {
    return icon;
}
public int getID() {
    return ID;
}
public int getnowID() {
    return nowID;
}
public int getx()
{
    return this.getBounds().x;
}

public int gety()
{
    return this.getBounds().y;
}
public int
  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值