2017-11-09 17 views
3

홍수 채우기를 프로그래밍하려고하지만 재귀에 문제가 있습니다. 오류 MSG는 말한다 :Floodfill StackOverFlow, IDEA

public class FillerSeedFill<PixelType> { 
    public RasterImage<PixelType> filler (RasterImage<PixelType> img, 
              int x, int y, 
              PixelType newPixel, 
              PixelType borderPixel, 
              PixelType currentPixel 
             ){ 

     RasterImage<PixelType> result = img; 
     if (borderPixel != currentPixel){ 
      if(currentPixel!=newPixel) { 

       result = result.withPixel(x, y, newPixel); 

       filler(img,x+1,y,newPixel,borderPixel,currentPixel); 
       filler(img,x-1,y,newPixel,borderPixel,currentPixel); 
       filler(img,x,y+1,newPixel,borderPixel,currentPixel); 
       filler(img,x,y-1,newPixel,borderPixel,currentPixel); 

       return result; 
      } 
     } 
     return result; 
    } 
} 

과 캔버스 :

if(jComboBoxSelectColoring.getSelectedIndex()==0){ 
    System.out.println("Seed fill"); 
    int currentPixel = 0x2f2f2f; 
    System.out.println(currentPixel); 
    fillerSeedFill.filler(rasterImage, 
     previousX,previousY, 
     0xC4D4AF, 
     0x8AC249, 
     currentPixel); 
    System.out.println(previousX+" "+previousY); 
    panel.repaint(); 
} 

"예외 스레드에서"AWT-EventQueue의-0 "java.lang.StackOverflowError의이"여기

내 코드입니다 IDEA에서 XSS를 변경할 수 있습니까? 나는 이클립스에서 기억하고있다. (-XSS100M)

currentPixel은 canva의 배경색 (0x2f2f2f)의 collor이다.

편집 : 이전 X에서 Y는 청취자의 커서 위치를 나타냅니다.

수정 됨 : 문제는 현재 픽셀이 실제 색상 값을 사용하지 않았 음을 나타냅니다. const가 있습니다. 0x2f2f2f 비교는 비논리적이었습니다. :) .. 감사합니다 모두

+0

문제 : 하나의 간단한 옵션을 사용하면 좌표를 채우고있는에 Deque와를하는 것입니다, 다음, 다음 의사 코드 같은 것을 꺼내십시오 귀하의 스택이 오버플로 될 때까지 메서드를 호출하는 것보다 –

+0

괜찮습니까? 그래서 어떻게 수정해야하는지 알고 계십니까? ... 모든 재귀 호출 전에 조건을 추가해야합니까? @ maytham-ɯɐɥʇʎɐɯ – pajasv

답변

0

인자 저장 XSS를 설정하려면, IntelliJ에, 당신은 할 수 있습니다 : 를 실행/디버그 구성 편집 실행/디버그 Configurationdialog의

  1. 클릭 구성 탭의 구성 옵션을 정의하려면 .
  2. Main class 필드에 main() 메소드가 포함 된 클래스를 지정하십시오. 이를 수행하려면 수동으로 정규화 된 이름을 입력하거나 줄임표 단추를 클릭하고 기본 클래스 선택 대화 상자에서 원하는 클래스를 선택하십시오. 기본 클래스 선택 대화 상자에서 다음 방법 중 하나를 사용하여 원하는 클래스를 찾을 수 있습니다.
  3. 프로젝트 탭을 클릭하고 프로젝트 트리 뷰에서 main() 메소드로 클래스를 선택합니다.
  4. 이름으로 검색 탭을 클릭하고 클래스 이름을 입력하기 시작하십시오. 입력하는 동안 사용 가능한 클래스 목록이 항목에 맞게 좁혀집니다. 확인을 클릭하거나 준비가되면 Enter 키를 누릅니다.
  5. VM options 필드에 선택적 VM 인수 (예 : 힙 크기, 가비지 수집 옵션, 파일 인코딩 등)를 입력하십시오. VM 인수 행이 너무 길면 /help/img/idea/2017.2/editorIcon을 누르십시오. .gif를 선택하고 편집기 대화 상자에 텍스트를 입력하십시오.
  6. 프로그램 매개 변수 필드에 인수 배열을 통해 main() 메서드에 전달해야하는 선택적 매개 변수 목록을 입력하십시오.
  7. 작업 디렉토리 필드에서 응용 프로그램이 실행 중에 사용할 현재 디렉토리를 지정하십시오.
  8. 모듈의 classpath 및 SDK 사용 필드에서 프로젝트에있는 모듈 목록에서 원하는 모듈을 선택하십시오.

출처 : https://www.jetbrains.com/help/idea/setting-configuration-options.html

+0

잘 프로그램 인수 -XSS100M에 추가했지만 stil 작동하지 않았다 :/.. 다른 생각이 있습니까? – pajasv

0

는 대신 반복 알고리즘을 변경할 수 있도록 스택 크기 가능성이 매우 작은 이미지를 제외하고, 충분하지 않습니다 증가.먼저 하나의 안타 때, 밖으로 조건, 4 개 recurrtion의 통화를

Deque<Point> queue = new ArrayDeque<>(); 
queue.add(new Point(x, y)); 
while (!queue.isEmpty()) { 
    Point pt = queue.poll(); 
    // then do the same thing you were already doing, except use pt.x and pt.y, 
    // and add new points to the queue instead of recursive calling 
}