深度优先搜索--八数码问题(一)(升级版 11数码)

本文介绍如何使用深度优先搜索算法解决11数码问题,这是一个在12个格子中包含空位和1-11数字的挑战。与八数码问题不同,11数码允许八个方向的移动,包括对角线。文章将展示相关代码并进行详细解释。
摘要由CSDN通过智能技术生成

利用深度优先搜索解决八数码问题的进阶版本--十一数码。

十一数码是在12个格子中,存在一个空位及1-11个数字的游戏。

进阶版本不同于八数码上下左右移动的特性,可以向上、下、左、右、左上、左下、右上、右下,一共八个方向移动(不过当然也不能超出边界)。

代码先放出来,之后详细讲解。

import java.util.*;
import java.io.*;

public class miniProject {


    public static void main(String[] args) {

        Scanner scan = new Scanner(System.in);
        String initState = scan.nextLine();
        String goalState = scan.nextLine();

        String currentState;



        //  Deep-First Search
//
        DFS dfSearch = new DFS();
        dfSearch.Init(initState, goalState);
        dfSearch.Search();

        dfSearch.findPath();


    }
}

 

import java.util.*;
import java.io.*;


public class DFS {

    //  思路:
    //  图中存储当前节点及其父节点 用于抵达目标之后计算回溯路径
    //  close数组存储已访问过的节点 需要声明的大一些
    //  图中存储的key值为每个状态+上一步是如何到达此状态的操作符'a'--'l'
    //  代表将『0』移动至位置'*'

    //  数据结构:
    //  Open        栈
    //  Close       数组
    //  Backtrack   图

    private Stack<String> openList = new Stack();
    private Stack<String> closeList = new Stack();
    private HashMap<String, String> backMap = new HashMap<>();
    private Stack<String> outputList = new Stack<>();
    private Stack<String> outputMoveList = new Stack<>();

    private boolean findGoal = false;
    private boolean canMove = false;

    private String initState;
    private String goalState;
    private String currentState;
    private String childState;

    private String popState;
    private String popModified;

    private int numOfNodes = 0;

    public DFS() {

    }

    public void Init(String initState, String goalState) {
        openList.push(initState);

        this.initState = initState;
        this.goalState = goalState;

        openList.push(initState);

        backMap.put(initState, "0");

    }


    public void Search() {

        //  比较起始节点,如果为目标节点 -->结束 找到目标
        if(initState.equals(goalState)) {
            //  若相同 -->结束 找到目标 跳出循环
            findGoal = true;
            System.out.println("Find the goal s
  • 0
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值