我刚接触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。有人可以帮助我在这里哪里出错吗?非常感谢您!
答案 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;
}
}