在董事会中找到有效职位

时间:2017-12-16 11:41:35

标签: javascript algorithm

我正在寻找解决Puzzle 15游戏的问题。 Example

基本上在每个位置,有效位置只能垂直或水平。我正在寻找一种算法,可以在16个元素,4乘4的电路板中的任何给定位置确定它。

目前我的位置是硬编码的

var rules = [
    { "0": [1, 4]},{ "1": [0, 2, 5] },{ "2": [1, 3, 6] },{ "3": [2, 7] },
    { "4": [0, 5, 8] },{ "5": [1, 4, 6, 9] },{ "6": [2, 5, 7, 10] },{ "7": [3, 6, 11] },
    { "8": [4, 9, 12] },{ "9": [5, 8, 10, 13]},{ "10": [6, 9, 11, 14] },{ "11": [7, 10, 15] },
    { "12": [8, 13] },{ "13": [12, 9, 14] },{ "14": [10, 13, 15] },{ "15": [11, 14] },
]

例如,在位置“0”,只有位置[1,4]有效才能从中移动。

 [ _,  1,   2,  3 ]
 [ 4,  5,   6,  7 ]
 [ 8,  9,  10, 11 ]
 [ 0,  12, 13, 14 ]

什么是更好的方法?

1 个答案:

答案 0 :(得分:0)

我不确定我是否100%理解你的问题,但我希望这会有所帮助。

如果我理解正确:

  • 您需要一个可以告诉您的功能,可以移动哪些单元格。
  • 只有当单元格与空单元格直接相邻时,才能移动单元格。

我会建议这样的事情:



    // game grid, empty-cell = -1
    const grid = [
        [ 1,  2,  3,  4],
        [ 5,  6,  7,  8],
        [ 9, 10, 11, 12],
        [13, 14, -1, 15],
    ]

    // Gets value from grid, return null when outside of array
    function getCellValue(grid, row, col) {
        if (grid[row] === undefined) return null;
        if (grid[row][col] === undefined) return null;
        return grid[row][col];
    }

    // Returns array of [row, col] cells,
    // that are direct neighbors of the empty cell
    function getEmptyCellNeighbors(grid) {
        let cells = [];
        grid.forEach((cols, row) => {
            cols.forEach((value, col) => {
                if (getCellValue(grid, row - 1, col) === -1) cells.push([row, col]);
                if (getCellValue(grid, row + 1, col) === -1) cells.push([row, col]);
                if (getCellValue(grid, row, col - 1) === -1) cells.push([row, col]);
                if (getCellValue(grid, row, col + 1) === -1) cells.push([row, col]);
            })
        })
        return cells;
    }

    // The empty cell(-1) is at[row = 3, col = 2]
    // You can move  11, 14, 15 to the empty cell.
    // The cuntion will return the[row, col] of cells 11, 14 & 15

    console.log(getEmptyCellNeighbors(grid));
    // returns => [
    //     [2, 2], // 11
    //     [3, 1], // 14
    //     [3, 3], // 15
    // ]