利用深度优先搜索解决八数码问题的进阶版本--十一数码。
十一数码是在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