gpt4 book ai didi

java - 如何从一个单元格检查所有可到达的单元格

转载 作者:行者123 更新时间:2023-12-01 20:27:14 24 4
gpt4 key购买 nike

我需要检查从二维数组中的某个单元格可到达的所有可能路径。例如;

int [][] grid = {{2, 0, 0, 1, 1, 2}, 
{1, 0, 2, 0, 0, 1},
{1, 0, 2, 0, 4, 2},
{8, 3, 4, 0, 1, 2},
{1, 2, 5, 0, 3, 3},
{5, 1, 1, 2, 1, 0}};`

我想检查从 cell(2)(1) 可到达的所有单元格(这只是一个示例位置)。如果该位置为零,则首先将在此处放置一些数字。例如,1 被放置在该位置。然后我需要开始合并从单元格 (2,1) 可达的所有 1。如果创建此路径的单元格自 1+1 以来至少包含两个 1,则单元格 (2)(1) 位置必须替换为 2 = 2。 之后,合并过程中使用的单元格必须分配为零。但如果 cell(2)(1) 仍然有可能合并,它们也应该合并。我尝试使用递归函数,但它没有按我想要的方式工作。我无法弄清楚如果少于 3 个包含相同值的相邻单元格如何防止合并,以及如何合并直到没有可能的合并。方法应该继续合并,直到没有可能的合并剩下,但我的代码合并了一次。我刚刚开始学习java,现在已经犯了错误,抱歉。

最佳答案

所以...我不确定我是否一切都正确,因为有些事情具有误导性。cell(2)(2) 的初始内容为:2

我认为您选择的单元格是(1)(2)。//注意:java中的索引从0开始

所以你的想法有点复杂,不应该仅用一种方法来解决。

我写了一些代码:

private static int[][] directions = new int[][]{{1,0},{-1,0},{0,1},{0,-1}};

public static void step(int[][] array, int x, int y) {

if(array[x][y] == 0){
array[x][y] = 1;
}else{
return;
}
int number = 1;
while(true){
printGrid(array);
int amount = process(array, x, y);
if(amount == 1)break;
number ++;
array[x][y] = number;
}
}

public static int process(int[][] array,int x, int y){
int number = array[x][y];
if(number == 0) return 0;
int total = 1;
array[x][y] = 0;
for(int[] dire:directions){
if(x + dire[0] >= 0 && x + dire[0] < array.length && y + dire[1] >= 0 && y + dire[1] < array[0].length){
if(array[x + dire[0]][y+dire[1]] == number){
total += process(array, x + dire[0], y+dire[1]);
}
}
}
return total;
}


public static void printGrid(int[][] grid) {
for(int i = 0; i < grid.length; i++){
String s = "";
for(int n = 0; n< grid[0].length; n++){
s += grid[i][n]+", ";
}
System.out.println(s);
}
System.out.println("");
}

public static void main(String[] args){
int [][] grid =
{{2, 0, 0, 1, 1, 2},
{1, 0, 2, 0, 0, 1},
{1, 0, 2, 0, 4, 2},
{8, 3, 4, 0, 1, 2},
{1, 2, 5, 0, 3, 3},
{5, 1, 1, 2, 1, 0}};

Main.step(grid, 2,1);

printGrid(grid);

}

我是这样修改的;

public static void main(String []args){
System.out.println("Welcome to the game Merge Numbers. Your grid as follows:");
int[][] newGrid = {{2, 0, 1, 1, 0, 8},
{2, 1, 0, 2, 4, 0},
{1, 2, 1, 2, 1, 3},
{2, 3, 2,0, 1, 0},
{0, 0, 5, 8, 7, 2},
{2, 0, 1, 1, 0, 0}};
for(int i = 0 ; i < newGrid.length ; i++){
for (int j = 0; j < newGrid[i].length; j++) {
System.out.print(newGrid[i][j] + " ");
}
System.out.println();
}
try (Scanner keyboard = new Scanner(System.in)){
System.out.print("Please enter your target's row index:");
int newRow = keyboard.nextInt();
System.out.print("Please enter your target's column index:");
int newColumn = keyboard.nextInt();
System.out.print("Please enter the number that you want to add to location " + newRow + " " + newColumn);
int newNextNumber = keyboard.nextInt();
step(newGrid, newRow, newColumn, newNextNumber);
for(int i = 0 ; i < newGrid.length ; i++){
for (int j = 0; j < newGrid[i].length; j++) {
System.out.print(newGrid[i][j] + " ");
}
System.out.println();
}}
}

public static void step(int[][] grid, int row, int column, int nextNumber ) {

if(grid[row][column] == 0){
grid[row][column] = nextNumber;
}else{
return;
}
int number = nextNumber;
while(true){
int amount = process(grid, row, column);
if(amount == 1)break;
number ++;
grid[row][column] = number;
}
}

public static int process(int[][] grid,int row, int column){
int number = grid[row][column];
if(number == 0) return 0;
int total = 1;
grid[row][column] = 0;
for(int[] dire:directions){
if(row + dire[0] >= 0 && row + dire[0] < grid.length && column + dire[1] >= 0 && column + dire[1] < grid[0].length){
if(grid[row + dire[0]][column+dire[1]] == number){
total += process(grid, row + dire[0], column+dire[1]);
}
}
}
return total;
}

}但是当我运行它时,包括目标位置在内的所有点都变为零。输出就像;

Welcome to the game Merge Numbers. Your grid as follows:
2 0 1 1 0 8
2 1 0 2 4 0
1 2 1 2 1 3
2 3 2 0 1 0
0 0 5 8 7 2
2 0 1 1 0 0
Please enter your target's row index:3
Please enter your target's column index:3
Please enter the number that you want to add to location 3 3: 1
2 0 1 1 0 8
2 1 0 0 4 0
1 2 1 0 0 3
2 3 0 0 0 0
0 0 5 8 7 2
2 0 1 1 0 0

我的意思是,如果您查看输出中的第一个网格,则 cell(3)(3) 为零。当 1 放置在这里时,从此单元格 (3)(3) 可到达的 1 会合并。然后 cell(3)(3) 包括 2。之后执行相同的过程。但是当所有可能的合并完成后,在此过程中使用的所有单元格(包括中心)都变为0。每次合并后中心应加1。我认为,我错误地使用了第四个参数 nextNumber 。函数过程是否也应该包含该参数?抱歉打扰您了:)

关于java - 如何从一个单元格检查所有可到达的单元格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43698077/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com