cuốn sách gpt4 ai đã làm

Java FloodFill Vấn đề lỗi tràn ngăn xếp

In lại Tác giả: Taklimakan Thời gian cập nhật: 2023-11-02 19:45:24 26 4
mua khóa gpt4 Nike

Tôi đang cố gắng triển khai vấn đề tràn ngập 4 chiều bằng cách sử dụng java.
Thuật toán lấp lũ Wikipedia

câu hỏi:

Tôi có ma trận này

1 2 1
1 2 2
2 1 2

Bây giờ tôi sẽ chọn phần tử (0,1) của ma trận này và áp dụng bài toán lấp lũ cho nó, thay đổi tất cả 2 thỏa mãn điều kiện đệ quy của tôi thành 3 giây.

Ma trận cuối cùng của tôi phải là:

1 3 1
1 3 3
2 1 3

Tôi đã viết mã Java cho việc này nhưng nó gây ra lỗi StackOverflow. Ai có thể giúp tôi tìm ra cách để tránh nó.

Đây là mã của tôi:

nhập java.util.*;
lớp công khai abc {

mảng in void tĩnh(int a[][])
{
cho (int i=0;i<3;i++)
{
for(int j=0;j<3;j++)
{
System.out.print(a[i][j]+ " ");
}
System.out.println();
}

}
lũ void tĩnh (int arr[],int x,int y) {
//trường hợp cơ bản
if (x < 0 || x >= 3 || y < 0 || y >= 3||arr[x][y] == 1) {
return;
}


// tôi đã tạo một hàm cụ thể theo thứ nguyên nhưng tôi có thể khái quát hóa nó!.
mảng[x][y] = 3;
lũ(arr,x-1,y);
lũ(arr,x,y-1);
lũ(arr,x,y+1);
lũ(arr,x+1,y);
}

public static void main(String[] args) {
màn hình int[][] = {
{1, 2, 1},
{1, 2,2},
{2,1,2}
};

lũ (màn hình, 0,1);
printarray(màn hình);
}

sai lầm:

Ngoại lệ trong luồng "chính" java.lang.StackOverflowError
tại java.base/sun.nio.cs.UTF_8.updatePositions(UTF_8.java:79)
tại java.base/sun.nio.cs.UTF_8$Encode.encodeArrayLoop(UTF_8.java:509)
tại java.base/sun.nio.cs.UTF_8$Encode.encodeLoop(UTF_8.java:564)
tại java.base/java.nio.charset.CharsetEncode.encode(CharsetEncode.java:576)
tại java.base/sun.nio.cs.StreamEncode.implWrite(StreamEncode.java:292)
tại java.base/sun.nio.cs.StreamEncode.implWrite(StreamEncode.java:281)
tại java.base/sun.nio.cs.StreamEncode.write(StreamEncode.java:125)
tại java.base/java.io.OutputStreamWriter.write(OutputStreamWriter.java:211)
tại java.base/java.io.BufferedWriter.flushBuffer(BufferedWriter.java:120)
tại java.base/java.io.PrintStream.newLine(PrintStream.java:624)
tại java.base/java.io.PrintStream.println(PrintStream.java:772)
tại abc.flood(abc.java:19)
tại abc.flood(abc.java:30)
tại abc.flood(abc.java:30)
tại abc.flood(abc.java:33)
tại abc.flood(abc.java:30)
tại abc.flood(abc.java:33)

câu trả lời hay nhất

Vấn đề của bạn là ở dòng này:

lũ(arr,x-1,y);
lũ(arr,x,y-1);
lũ(arr,x,y+1);
lũ(arr,x+1,y);

Bạn đang khám phá vô điều kiện tất cả 4 hướng của ô hiện tại trong tìm kiếm theo chiều sâu, điều này tạo ra một vòng lặp đệ quy vô hạn ở đâu đó khi tìm kiếm chuyển đổi giữa hai khối biểu đồ giống nhau. Để giải quyết vấn đề này, hoặc

  • Theo dõi các ô đã khám phá và không bao giờ truy cập chúng nữa
  • Thực hiện tìm kiếm theo chiều rộng đầu tiên thay vì DFS
  • Thực hiện tìm kiếm theo chiều sâu sâu hơn lặp đi lặp lại.

Đơn giản nhất là sửa đổi dòng sau

if (x < 0 || x >= 3 || y < 0 || y >= 3||arr[x][y] == 1) {
return;
}

nếu như mảng[x][y] != 2 sau đó trả về, điều này thực hiện hiệu quả tùy chọn số 1, bằng cách ngăn bạn khám phá những gì đã được chuyển đổi thành 3 của tế bào, vì 3 != 2sẽ gây ra nótrở lại .

if (x < 0 || x >= 3 || y < 0 || y >= 3||arr[x][y] != 2) {
return;
}

Về lỗi tràn ngăn xếp Sự cố FloodFill của Java, chúng tôi đã tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/54730639/

26 4 0
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress