九宫格问题

这里所说的九宫格问题,是指:
“八数码难题”搜索
问题描述:
  通过单步移动把下面的矩阵移动成1-8环绕一周的矩阵(即0在中间,1-8顺序排成一圈,1在哪儿无所谓)
这里写图片描述

  1. 分别用宽度和深度搜索进行
  2. 假设启发式的方程为, 其中d(n)为层次或深度,h(n)为错位的个数,试用启发式算法解决
  3. 编程(分别用宽度搜索,深度搜索和启发式算法),并分析步数

下面贴代码(JAVA):

  1. 启动文件
  2. 定义状态转换矩阵类
  3. 三种搜索算法
import java.util.HashSet;

public class StartUp {
    public HashSet<String> getFinishedID() {
        // 判断是否到达目标状态(达到结束条件)
        // 达到,返回true
        HashSet<String> finished_ID = new HashSet<String>();
        String temp_string = "1234567812345678";
        String reverse = "8765432187654321";
        for (int i = 0; i < 8; i++) {
            finished_ID.add(temp_string.substring(i, i + 8));
            finished_ID.add(reverse.substring(i, i + 8));
        }
        return finished_ID;
    }

    public static void main(String[] args) {
        int[][]  start_matrix = {
                {
  2, 8, 3},
                {
  1, 6, 4},
                {
  7, 0, 5},
        };
        SSState state = new SSState(start_matrix, 2, 1);
        HashSet<String> finished_ID = new StartUp().getFinishedID();
        ThreeSolution three = new ThreeSolution();
        System.out.println("广度优先遍历步数:" + three.BFS(state, finished_ID));
//      System.out.println("深度优先遍历步数:" + three.DFS(state, finished_ID));
//      System.out.println("启发式遍历步数:" + three.Heuristic(state, finished_ID));
    }
}
import java.util.HashSet;
import java.util.Iterator;

public class SSState {
    // 状态空间
    int zeroX;  // 0点横坐标
    int zeroY;  // 0点纵坐标
    int[][] state_matrix;  // 矩阵
    String ID = "";  // 唯一标识符
    int step;  // 步长
    HashSet<String> finished_ID;  // 目标ID
    int f;  // 启发式算法目标函数值

    public SSState() {
        zeroX = 0;
        zeroY = 0;
        state_matrix = null;
        ID = "";
    }

    public SSState(int[][] matrix, int x, int y) {
        zeroX = x;
        zeroY = y;
        state_matrix = matrix;
        ID = getID(matrix);
    }

    public void setStepAndFinish(int s, HashSet<String> finished) {
        step = s;
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值