public static Point minDistanceInMatrix(int[][] matrix) { int m = matrix.length; int n = matrix[0].length; int res = Integer.MAX_VALUE; int numOfOne = countOne(matrix); Point minP = new Point(-1,-1,-1); for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { if (matrix[i][j] == 0) { int newRes = goHelper(matrix, i, j, res, numOfOne); if ( newRes < res) { minP.x = i; minP.y = j; res = newRes; } } } } return minP; } public static int countOne(int[][] matrix) { int res = 0; for (int i = 0; i < matrix.length; i++) { for (int j = 0; j < matrix[0].length; j++) { if (matrix[i][j] == 1) res++; } } return res; } public static int goHelper(int[][] matrix, int x, int y, int curr, int numOfOne) { Queue q = new LinkedList<>(); boolean[][] visited = new boolean[matrix.length][matrix[0].length]; visited[x][y] = true; q.add(new Point(x,y,0)); int count = 0; int step = 0; while (!q.isEmpty()) { Point p = q.poll(); int[][] directions = {{0,1},{1,0},{-1,0},{0,-1}}; for (int[] d : directions) { int nx = p.x + d[0]; int ny = p.y + d[1]; int nd = p.d + 1; if (nx < 0 || nx >= matrix.length || ny < 0 || ny >= matrix[0].length || matrix[nx][ny] == -1 || visited[nx][ny] == true) continue; visited[nx][ny] = true; if (matrix[nx][ny] == 0) { q.add(new Point(nx,ny,nd)); } if (matrix[nx][ny] == 1) { step += nd; count++; if (count == numOfOne) { return step; } } } } return Integer.MAX_VALUE; } public static void main(String[] args) { int[][] input = {{0, 0, 0, -1, 0},{0, 1, 0, 0, 1},{0, -1, 1, 0, 0 }}; Point p = minDistanceInMatrix(input); System.out.println(p.x +","+p.y); }