2012-09-23 2 views
4

사용자가 지정한 초기 좌표를 사용하고 문자를 확인한 다음 원하는대로 채우기 방법을 만드는 중입니다. 그런 다음 인접한 사각형을 확인하고 프로세스를 반복합니다. 몇 가지 연구를 한 후, 홍수 채우기 알고리즘을 시도해 보았습니다 (작동하지만 최대 250 자의 배열에 대한 최대 요구 사항을 충족시킬 수 없음). 유사한 문제에 대한 Wikipediathis question asked previously에 설명 된대로홍수 채우기 최적화 : 대기열 사용 시도

public static void fillArea (int x, int y, char original, char fill){ 

    if (picture[y-1][x-1] != original){ 
     return; 
    } 
    picture[y-1][x-1] = fill; 
    fillArea (x-1, y, original, fill); 
    fillArea (x+1, y, original, fill); 
    fillArea (x, y-1, original, fill); 
    fillArea (x, y+1, original, fill); 

    return; 
} 

테스트 후, 나는 큐 방법을 시도하기 시작했다 다음과 같이

내 원래 홍수 채우기 알고리즘이었다. 지금까지, 나는 다음과 같은 코드로 올라와있다 : 첫 번째, 재귀 방법은 작은 값을 작업 할 수있는 동안 배열이 너무 큰 얻을 때, 그것은 작동하지 않습니다

public static void fillArea (int x, int y, char original, char fill){ 
    if (x != 0) 
    x--; 
    if (y!= 0) 
    y--; 
    Queue<Point> queue = new LinkedList<Point>(); 
    if (picture[y][x] != original){ 
     return; 
    } 
    queue.add(new Point(x, y)); 

    while (!queue.isEmpty()){ 
     Point p = queue.remove(); 
     if (picture[p.y][p.x] == original){ 
     picture[p.y][p.x] = fill; 
     queue.add(new Point(p.x-1, p.y)); 
     queue.add(new Point(p.x+1, p.y)); 
     queue.add(new Point(p.x, p.y-1)); 
     queue.add(new Point(p.x, p.y+1)); 
     } 
    } 

    return; 
} 

. 그러나 두 번째 방법은 Queues에 대한 나의 미숙 함으로 인해 식별 할 수없는 일종의 무한 루프로 나를 데려다주고 있습니다. 더 큰 샘플을 처리하기 위해 첫 번째 코드 샘플을 최적화하거나 결과를 제공하도록 두 번째 코드 샘플을 수정하는 방법은 무엇입니까? 누구든지이 두 가지를 코딩하는 방법이나 내가 잘못하고있는 것을 설명 할 수 있습니까?

감사합니다.

EDIT : 두 번째 코드에서 무한 루프 오류를 찾을 수 있었지만 큐 기반 메서드는 전체 영역을 채우지 않습니다. 사실 재귀 기반 방법보다 영역을 적게 채 웁니다. EDIT 2 : 정사각형 배열에서 작동합니다. 직사각형 배열에서도 제대로 작동하는지 어떻게 확인할 수 있습니까 (두 번째 방법).

답변

1

if (picture[p.y][p.x] == original){ 
    picture[p.y-1][p.x-1] = fill; 

이 있어야하지 대기열에

if (picture[p.y][p.x] == original){ 
    picture[p.y][p.x] = fill; 

- 방법?

+0

그래, 고마워. 나는 너의 대답을보기 전에 바로 그 문제를 고쳤다. – n0shadow

+0

사각 이미지의 경우 이제 작동합니다. 구형 이미지에서도 사용할 수 있도록 수정하려면 어떻게해야합니까? – n0shadow

+0

링크 된 Wikipedia Article에는 직사각형 이미지를 풀 수있는 방법이 있습니다. 동/서 및 남/북으로 알고리즘을 분리합니다. 하나의 "노드"의 경우 먼저 국경을 접할 때까지 서부 및 동부를 확장하고 그 사이의 모든 것을 변경합니다. 그런 다음 북쪽과 남쪽 노드를 대기열에 추가하고 다른 반복을 수행합니다. – Fildor

1

참고로 처리 할 어레이 주위에 버퍼 경계를 추가하여 문제를 해결했습니다. 예를 들어, 어레이가 채워지는 경우에 처리되기 전에

##### 
    #000# 
    #000# 
    #000# 
    ##### 

000 
000 
000 

그것이 만들어 하였다.

+0

사각형 배열에서만 작동합니다. 직사각형 배열은 여전히 ​​문제를 일으키고 있습니다. – n0shadow

관련 문제