사용자가 지정한 초기 좌표를 사용하고 문자를 확인한 다음 원하는대로 채우기 방법을 만드는 중입니다. 그런 다음 인접한 사각형을 확인하고 프로세스를 반복합니다. 몇 가지 연구를 한 후, 홍수 채우기 알고리즘을 시도해 보았습니다 (작동하지만 최대 250 자의 배열에 대한 최대 요구 사항을 충족시킬 수 없음). 유사한 문제에 대한 Wikipedia 및 this 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 : 정사각형 배열에서 작동합니다. 직사각형 배열에서도 제대로 작동하는지 어떻게 확인할 수 있습니까 (두 번째 방법).
그래, 고마워. 나는 너의 대답을보기 전에 바로 그 문제를 고쳤다. – n0shadow
사각 이미지의 경우 이제 작동합니다. 구형 이미지에서도 사용할 수 있도록 수정하려면 어떻게해야합니까? – n0shadow
링크 된 Wikipedia Article에는 직사각형 이미지를 풀 수있는 방법이 있습니다. 동/서 및 남/북으로 알고리즘을 분리합니다. 하나의 "노드"의 경우 먼저 국경을 접할 때까지 서부 및 동부를 확장하고 그 사이의 모든 것을 변경합니다. 그런 다음 북쪽과 남쪽 노드를 대기열에 추가하고 다른 반복을 수행합니다. – Fildor