我正在尝试找到以下程序的预期输出。.但是我遇到了错误
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3
at programbasics.CountingConnections.count(CountingConnections.java:7)
at programbasics.CountingConnections.main(CountingConnections.java:26)
我的问题是关于矩阵m * n 。矩阵中的元素填充有值1和0 。
1 表示正在建立连接, 0 表示未建立连接。
我们需要垂直,水平和对角线地连接可用的相邻位置,并计算已建立的不同的连接的数量
我的代码是
package programbasics;
class CountingConnections
{
static int count(int a[][], int i, int j) {
int rows = a.length;
int cols = a[0].length;
if(a[i][j] == 0) return 0;
if (i == rows - 1 && j == cols - 1)
return a[i][j];
else if (i == rows - 1)
return a[i][j + 1];
else if (j == cols - 1)
return a[i + 1][j];
else if (a[i][j] == 1)
return count(a, i + 1, j) + count(a, i, j + 1);
else
return 0;
}
public static void main(String[]args)
{
int a[][] = {{1,0,0,1},
{0,1,1,1},
{1,0,0,1}};
int i = 3;
int j = 4;
System.out.println(count(a, i, j));;
}
}
预期输出为 8 。像位置连接如下
1)(0,0)->(1,1)
2)(2,0)->(1,1)
。
。
。
。
8)(0,3)->(1,3)
无法获得预期的输出8 。
public static int count(int[][] a) {
int[][] paths = new int[a.length][a[0].length];
if ((paths[0][0] = a[0][0]) == 0) {
return 0;
}
for (int c = 1; c < a[0].length; c++) {
paths[0][c] = a[0][c] * paths[0][c - 1];
}
for (int r = 1; r < a.length; r++)
{
paths[r][0] = a[r][0] * paths[r - 1][0];
for (int c = 1; c < a[r].length; c++)
{
paths[r][c] = a[r][c] * (paths[r - 1][c] + paths[r][c - 1]);
}
}
return paths[a.length - 1][a[0].length - 1];
}
答案 0 :(得分:0)
您在代码中调用if(a[i][j] == 0)
,在其中您将3
传递为i
,将4
传递为j
。但是Array
的索引为零,因此当您尝试调用a[3][4]
时,您尝试的是
0 1 2 3 4
0 {1, 0, 0, 1}
1 {0, 1, 1, 1}
2 {1, 0, 0, 1}
3 X
4
X
所在的索引。显然,这不是您的Array
中的有效索引。
另外,您的方法在不同的地方调用a[i + 1][j]
和a[i][j + 1]
,这意味着在确保代码不受限制时必须考虑到这一点。
对于您的实际方法,您的逻辑似乎有点不对劲。 if(a[i][j] == 0) return 0;
将返回0
并停止递归并返回0
,而无需检查是否还有连接。您的逻辑应该更像这样:
1
向右看一个索引,向右向下看一个索引(对角线),向右向下看一个索引,向左向下看(第二对角线)。1
,那么就增加计数器。a[i][1]
开始,因为您需要检查a[a+1][j-1]
,如果是j == 0
,则将尝试调用a[a+1][-1]
,这将导致另一个索引输出范围答案 1 :(得分:0)
public static int count(int[][] a, int m, int n) {
int count = 0;
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (a[i][j] == 1) {
if (i - 1 >= 0 && j - 1 >= 0 && a[i - 1][j - 1] == 1) {
count = count + 1;
}
if (i - 1 >= 0 && a[i - 1][j] == 1) {
count = count + 1;
}
if (i - 1 >= 0 && j + 1 < n && a[i - 1][j + 1] == 1) {
count = count + 1;
}
if (j + 1 < n && a[i][j + 1] == 1) {
count = count + 1;
}
}
}
}
return count;
}
答案 2 :(得分:0)
private int countConnections(int[][] a, int rows, int columns) {
//cartesian plane coordinates around a point
final int[] x = {1, 1, 1, -1, -1, -1, 0, 0};
final int[] y = {1, -1, 0, 1, -1, 0, 1, -1};
int count = 0;
boolean[][] visited = new boolean[rows][columns];
for (int i = 0; i < rows; i++) {
for (int j = 0; j < columns; j++) {
for (int k = 0; k < 8; k++) {
int l = i + x[k];
int m = j + y[k];
//check for connections only if the given cell has value 1
if (a[i][j] == 1 && canVisit(l, m, rows, columns, visited) && a[l][m] == 1) {
count++;
}
}
visited[i][j] = true;
}
}
return count;
}
private boolean canVisit(int i, int j, int rows, int columns, boolean [][] visited) {
return i < rows && j < columns && i >= 0 && j >= 0 && !visited[i][j];
}
检查单元格值为 1 的单元格周围的所有 8 个单元格,并在遍历时将其标记为已访问。