计算数组中特定点的空闲元素

时间:2019-02-25 16:13:50

标签: java

我刚接触Java World并开始学习它。我要做的是从数组中的特定点开始计数自由元素。如果未占用从移动点开始的水平或垂直方向上的下一个移动元素,则会计算一个自由元素。

下面是我的代码:

    public static void main(String[] args) {
        char[][] arrs= new char[11][15];
        for (int i = 0; i < 11; i++) {
            for (int j = 0; j < 15; j++) {
                arrs[i][j] = '-';
            }
        }
        arrs[0][0] = '+';
        arrs[0][1] = '+';
        arrs[0][2] = '+';
        arrs[0][3] = '+';
        arrs[0][4] = '+';
        arrs[1][0] = '+';
        arrs[1][1] = 'P';
        arrs[1][4] = '+';
        arrs[2][0] = '+';
        arrs[2][1] = '+';
        arrs[2][2] = '+';
        arrs[2][4] = '+';
        arrs[3][3] = '+';
        arrs[3][4] = '+';

        Point point= new Point (1, 1);
        int result = 0;
        calculate(point, arrs, result);
        System.out.print(result);

    }

    private static void calculate(Point point, char[][] arrs, int result) {
        int x = point.getX();
        int y = point.getY();
        if (x >= 0 && x < 11 && y >= 0 && y < 13 && arrs[x][y + 1] == '-') {
            result = result + 1;
            arrs[x][y + 1] = 'o';
            calculate(new Point(x, y + 1), arrs, result);
        }
        if (x >= 0 && x < 11 && y > 0 && y < 14 && arrs[x][y - 1] == '-') {
            result = result + 1;
            arrs[x][y - 1] = 'o';
            calculate(new Point(x, y - 1), arrs, result);
        }
        if (x >= 0 && x < 10 && y >= 0 && y < 14 && arrs[x + 1][y] == '-') {
            result = result + 1;
            arrs[x + 1][y] = 'o';
            calculate(new Point(x + 1, y), arrs, result);
        }
        if (x > 0 && x < 11 && y >= 0 && y < 14 && arrs[x - 1][y] == '-') {
            result = result + 1;
            arrs[x - 1][y] = 'o';
            calculate(new Point(x - 1, y), arrs, result);
        }
    }

我的想法是,我将在P所在的点开始计数,这是我的point(1,1)。然后,我将检查右侧/左侧/底部/顶部上的每个下一个元素是否可移动,如果是,那么我会计数并将下一个计算移动到这一点,然后重复该过程。

不幸的是,我最终得到的结果为0。有人可以帮助我在这里哪里出错吗?非常感谢您!

2 个答案:

答案 0 :(得分:1)

您的int(结果)按值传递。当您在方法计算中分配新值时,它不会更改原始结果的值。

private static int calculate(Coordinate cCoordinate, char[][] board) {
    int x = cCoordinate.getX();
    int y = cCoordinate.getY();
    if (x >= 0 && x < 11 && y >= 0 && y < 13 && board[x][y + 1] == '-') {
        board[x][y + 1] = 'o';
        return calculate(new Coordinate(x, y + 1), board, result) + 1;
    }
    if (x >= 0 && x < 11 && y > 0 && y < 14 && board[x][y - 1] == '-') {
        board[x][y - 1] = 'o';
        return calculate(new Coordinate(x, y - 1), board, result) + 1;
    }
    if (x >= 0 && x < 10 && y >= 0 && y < 14 && board[x + 1][y] == '-') {
        board[x + 1][y] = 'o';
        return calculate(new Coordinate(x + 1, y), board, result) + 1;
    }
    if (x > 0 && x < 11 && y >= 0 && y < 14 && board[x - 1][y] == '-') {
        board[x - 1][y] = 'o';
        return calculate(new Coordinate(x - 1, y), board, result) + 1;
    }
}

类似的事情应该起作用。它将返回计数。但是,如果您想处理所有情况,则问题会稍微复杂一些。但是我认为您应该自己找到其余的答案。

答案 1 :(得分:1)

这很简单。您可以对标记为已访问的单元格使用深度优先搜索宽度优先搜索

public static void main(String... args) {
    char[][] arr = {
            { '+', '+', '+', '+', '+' },
            { '+', 'C', '-', '-', '+' },
            { '+', '+', '+', '-', '+' },
            { '-', '-', '-', '+', '+' },
    };

    System.out.println(new CountMovableSteps(arr).getAsInt()); // 3
}

public final class CountMovableSteps implements IntSupplier {
    private final char[][] board;
    private int x = -1;
    private int y = -1;

    public CountMovableSteps(char[][] board) {
        this.board = new char[board.length][];

        for (int row = 0; row < board.length; row++) {
            this.board[row] = new char[board[row].length];

            for (int col = 0; col < board[row].length; col++) {
                this.board[row][col] = board[row][col];

                if (board[row][col] == 'C') {
                    x = col;
                    y = row;
                }
            }
        }
    }

    @Override
    public int getAsInt() {
        return dfs(0, x, y);
    }

    private int dfs(int count, int row, int col) {
        if (row < 0 || row >= board.length || col < 0 || col >= board[row].length)
            return count;
        if (board[row][col] == '+' || board[row][col] == '*')
            return count;

        if (board[row][col] != 'C')
            count++;

        board[row][col] = '*';
        count = dfs(count, row, col + 1);
        count = dfs(count, row, col - 1);
        count = dfs(count, row + 1, col);
        count = dfs(count, row - 1, col);

        return count;
    }
}