Question 3 Seven Puzzle

理解题目

  • 一个board,每次吧这个borad里的某一个数字和其他人do something

  • 一个单词,每次把这个单词里的某一个char do something

  • 套路:以整体结构作为点,做隐式图搜索

High Level

  • this is a graph problem

    • vertex:整体的board是一个点

    • edge:通过一次操作(把0和四个方向交换)能到的点都是neighbor,

  • this is a actually S1 in Shortest Path Problem

Method BFS

// Some code

private static final int[][] DIRS = {{1,0}, {-1, 0}, {0,1}, {0, -1}};
class Board {
    private static final int R= 2;
    private static final int C = 3;
    private int[][] board = new int[R][C];
    private int[] indexOfZero = new int[2];
    public Board(int[][] target) {
        for (int = 0; i < target.length; i++) {
            for (int j = 0; j < target[0].length; j++) {
                if (target[i][j] == 0) {
                    this.indexOfZero[0] = i;
                    this.indexOfZero[1] = j;
                }
                this.board[i][j] = target[i][j];
            }
        }
    }
    public Board(Board original) {
        int[][] target = original.board;
         for (int = 0; i < target.length; i++) {
            for (int j = 0; j < target[0].length; j++) {
                if (target[i][j] == 0) {
                    this.indexOfZero[0] = i;
                    this.indexOfZero[1] = j;
                }
                this.board[i][j] = target[i][j];
            }
        }
    }
    @Override
    public int hashCode() {
        int code = 0;
        for (int i = 0; i < R; i++) {
            for (int j = 0; j < C; j++) {
                code = code * 31 + this.board[i][j];
            }
        }
    }
    @Override
    public boolean equals(Object obj) {
        if (obj == this) return true;
        if (!obj instanceof Board) return false;
        // if (obj != null && obj.getClass() != this.getClass()) return false;
        Board temp = (Board) obj;
        for (int i = 0; i < R; i++) {
            for (int j = 0; j < C; j++) {
                if (temp.board[i][j] != this.board[i][j]) {
                    return false;
                }
            }
        }
        return true;
    }  
}
private boolean isValid(Board board, int i ,int j) {
    return i >= 0 && j >= 0 && i < board.R && j < board.C;
}
// 我想把这个board里面的0和你给我一个方向进行交换

private void swap(Board board, int[] dir) {
    int[] indexOfZero = board.indexOfZero;
    int[] newIndex = new int[]{indexOfZero[0] + dir[0], indexOfZero[1] + dir[1]};
    board.board[indexOfZero[0]][indexOfZero[1]] = board.board[indexOfZero[0] + dir[0]][indexOfZero[1] + dir[1]];
    board.board[indexOfZero[0] + dir[0]][indexOfZero[1] + dir[1]] = 0;
    board.indexOfZero = newIndex;
}

Last updated