2D 그리드 홍수 채우기


9

도전 설명

2 차원, 직사각형 배열 (모든 서브 어레이의 길이가 동일 함을 의미 함), grid를 호출 해 봅시다 . 그리드의 모든 단위는 빈 공간 이거나 테두리 입니다. 문자 그리드에서 빈 공간은 단일 공백으로 표시됩니다. 다른 문자는 테두리로 취급됩니다. 샘플 그리드 ( 가독성을 위해 추가 된 ' +, |'및 -'- 그리드의 일부가 아님 ) :

+----+
|    |
|    |
|    |
|    |
|    |
+----+  an empty 4x5 grid

+------+
|      |
|  #   |
|  #   |
+------+  a 6x3 grid with 2 borders

+----------+
|          |
|          |
|  #####   |
|  #   #   |
| ##   # <------ enclosed area
| #    #   |
| ######   |
|          |
+----------+  a 10x8 grid with an enclosed area

2D 그리드와 한 쌍의 좌표가 주어지면 좌표로 표시된 점을 둘러싸는 닫힌 영역을 채 웁니다.

샘플 입력 / 출력

1)

0 0
+----------+      +----------+
|          |      |XXXXXXXXXX|
|          |  ->  |XXXXXXXXXX|
|          |      |XXXXXXXXXX|
+----------+      +----------+

2)

6 5
+-----------------+      +-----------------+
|                 |      |                 |
|                 |      |                 |
|    ########     |      |    ########     |
|    #       #    |      |    #XXXXXXX#    |
|    #    ####    |      |    #XXXX####    |
|    #    #       |      |    #XXXX#       |
|    #    #       |  ->  |    #XXXX#       |
|    #    #       |      |    #XXXX#       |
|     ####        |      |     ####        |
|                 |      |                 |
|                 |      |                 |
+-----------------+      +-----------------+

삼)

4 6
+-----------------+      +-----------------+
|                 |      |XXXXXXXXXXXXXXXXX|
|    ####         |      |XXXX####XXXXXXXXX|
|   #    #        |  ->  |XXX#    #XXXXXXXX|
|    ####         |      |XXXX####XXXXXXXXX|
|                 |      |XXXXXXXXXXXXXXXXX|
+-----------------+      +-----------------+

4)

4 5
+-----------------+      +-----------------+      +-----------------+ 
|                 |      |                 |      |                 |
|                 |      |                 |      |                 |
|    ####         |      |    ####         |      |     XXXX        |
|    ####         |  ->  |    ####         |  or  |     XXXX        |
|    ####         |      |    ####         |      |     XXXX        |
|                 |      |                 |      |                 |
+-----------------+      +-----------------+      +-----------------+

5)

2 6
+----------------+      +----------------+
|                |      |XXXXXXXXXXXXXXXX|
|                |      |XXXXXXXXXXXXXXXX|
|                |      |XXXXXXXXXXXXXXXX|
|                |  ->  |XXXXXXXXXXXXXXXX|
|                |      |XXXXXXXXXXXXXXXX|
|BBBBBBBBBBBBBBBB|      |BBBBBBBBBBBBBBBB|
|                |      |                |
|                |      |                |
+----------------+      +----------------+

노트

  • 빈 그리드는 닫힌 것으로 간주됩니다. 즉, 테두리는 그리드의 가장자리를 따라 암시 적으로 배치됩니다 (예 1 및 5 참조).

  • 닫힌 영역의 모서리는 L 자형 일 필요는 없습니다. 따라서 다음 두 영역은 동일합니다.

####         ##
#  #        #  #
#  #   ==   #  #
#  #        #  #
####         ##
  • 좌표 아래의 단위가 경계면 인 경우 그리드를 변경하지 않고 그대로 두거나 (예 : 4) 빈 공간으로 처리 할 수 ​​있습니다.

  • 제출물에이 정보를 포함하는 한 필러 / 빈 공간에 대한 문자를 선택할 수 있습니다.

  • char목적에 맞지 않는 유형을 사용하는 경우 ints( 0빈 공간, 1테두리) 또는 booleans( truefalse각각) 또는 다른 유형을 사용할 수 있습니다. 제출시이 정보를 포함 시키십시오.

  • 위 예제에서 사용 된 (row, column)좌표는 2 차원 배열에 더 편리하기 때문에 0 인덱스 좌표입니다. 사용하고자하는 경우 (column, row)(직교) 시스템 및 / 또는 비 0 인덱스 좌표를, 제출에 지정합니다.

  • 어디서부터 시작해야할지 모르는 경우 홍수 채우기에 대한 Wikipedia 기사를 확인 하십시오.

  • 이것은 코드를 최대한 짧게 만드십시오!


관련 : 1 , 2 , 3 , 4 , 가능하면 더.
피터 테일러

두 개의 유효한 출력이 있음을 나타 내기 위해 좌표 위치에 단일 경계 단위가있는 테스트 케이스를 가질 가치가 있습니다. 그리드가 모두 채워 졌거나 그리드가 변경되지 않았습니다. (I 올바르게 3 메모를 이해합니다.)
trichoplax

예를 참조하십시오. 4) 업데이트
shooqie

1
대체 예제 4를 얻는 방법을 얻지 못했습니다. 지정된 입력 사각형 이외의 테두리 셀을 파괴하는 것으로 보입니다.
Joffan

답변:


4

MATLAB, 30 7 바이트

문자열 대신 논리 입력을 사용할 수 있으므로 다음과 같이 bare 함수를 사용할 수 있습니다.

@imfill

이것은 익명의 기능입니다. 사용법을 위해서는 이름을 가정해야합니다 (예 :) f=@imfill. 그런 다음 우리는 그것을 평가 단지 수 f(input,point)곳, input예를 들어, 논리적 행렬 [0,0;0,1], 그리고 point예를 들어 1 기반의 좌표와 2 차원 벡터이다 [1,2].

문자열에서 작동하는 이전 버전 :

@(a,p)[imfill(a>32,p)*3+32,'']

이 익명 함수는 입력과 좌표 (1 기반 인덱스)가있는 벡터를 허용합니다. 이 함수 imfill는 우리가 필요한 것을 정확하게 수행하지만 이진 이미지에서만 작동합니다. 그렇기 때문에 입력 행렬을 논리 배열 ( #경계가 있고 공백은 공백)로 변환하고 채우기를 수행 한 다음 다시 변환합니다. (다시 #채워지고 공간이 채워지지 않습니다).

-1 바이트를 위한 @LuisMendo에게 감사합니다 .


문자열 버전의 경우 교체 할 수 있습니다 ~=32에 의해>32
루이스 Mendo에게

3

C, 162 바이트

w,l;char*d;f(z){z<0||z>l||d[z]^32||++d[z]&&f(z+1)+f(z-1)+f(z+w)+f(z-w);}main(c,v)char**v;{l=strlen(d=v[3]),w=strchr(d,10)-d+1,f(atoi(v[2])*w+atoi(v[1]));puts(d);}

인수 ( ./floodfill X Y grid) 에서 입력을받습니다 . 그리드는 각 줄을 포함 \n하거나 \r\n각 줄 사이에 있어야 하며 마지막 개행은 선택 사항입니다. 내가 쉘에서 호출하는 가장 간단한 방법 :

./floodfill 1 0 "$(printf "   \n###\n   \n")"
# or
./floodfill 1 0 "$(cat gridfile)"

!채우기 문자를 사용하여 stdout으로 출력합니다 . 시작 위치가와 일치 #하면 변경하지 않습니다.

고장:

                                    // GCC is happy enough without any imports
w,l;                                // Globals (line width, total length)
char*d;                             // Global grid pointer
f(z){                               // "Fill" function - z=current cell
    z<0||z>l||                      // Check if out-of-bounds...
    d[z]^32||                       // ...or not empty
        ++d[z]&&                    // Fill cell...
        f(z+1)+f(z-1)+f(z+w)+f(z-w);// ...and continue in "+" pattern
}
main(c,v)char**v;{                  // K&R style function to save 2 bytes
    l=strlen(d=v[3]),               // Store grid & length
    w=strchr(d,10)-d+1,             // Store width of grid (including newlines)
    f(atoi(v[2])*w+atoi(v[1]));     // Parse X & Y arguments and invoke fill

    puts(d);}                       // Print the result

이것은 입력 인수 문자열의 수정에 의존하므로 금지되어 있으므로 모든 플랫폼에서 작동하지 않을 수도 있습니다 (암시 적 선언은 이것을 비표준으로 만듭니다).


int w, l;간단히 변경하면 4 바이트를 절약 할 수 있습니다. w, l;gcc는 기본적으로 다음과 같이 int입력합니다.
Jacajack

@Jacajack 좋은 지적! 감사합니다
Dave

1

C - 263 247 240 238 바이트

이것은 첫 번째 번째 세 번째 버전이며 코드가 축소 될 수 있다고 생각합니다.

m[99][99],x,y,a,b,c,n;f(v,w){if(m[v][w]==32){m[v][w]=88;f(v,w+1);f(v+1,w);f(v,w-1);f(v-1,w);}}main(){scanf("%d %d\n",&a,&b);for(;~(c=getchar());m[x++][y]=c,n=x>n?x:n)c==10&&++y&&(x=0);f(b+2,a+1);for(a=-1;++a<y*n+n;)putchar(m[a%n][a/n]);}

그리고 읽을 수있는 버전 :

m[99][99], x, y, a, b, c, n;

/*
    a, b - flood fill start coordinates
    v, w - recursive function start coordinates
    x, y - iterators
    c - character read
    m - map
    n - maximum map width found

*/


//Recursive flood function
f( v, w )
{
    if ( m[v][w] == 32 ) //If field is empty (is ' '?)
    {
        m[v][w] = 88; //Put 'X' there
        f(v,w+1);f(v+1,w); //Call itself on neighbour fields
        f(v,w-1);f(v-1,w);
    }
}

main( )
{
    //Read coordinates
    scanf( "%d %d\n", &a, &b );

    //Read map (put character in map, track maximum width)
    for ( ; ~( c = getchar( ) ); m[x++][y] = c, n = x > n ? x : n )
        c == 10 && ++y && ( x = 0 );

    //Flood map
    f( b + 2, a + 1 );

    //Draw
    for ( a = -1; ++a < y * n + n; )
            putchar( m[a % n][a / n] );     

}

컴파일하고 실행하십시오.
gcc -o flood floodgolf.c && cat 1.txt | ./flood

자원:

참고 : 나는 int값을 연구하고 있습니다. 모든 (32)는 빈 공간으로 취급됩니다. 다른 값은 경계로 취급됩니다. 좌표는 형식입니다(row, column)


1
for( scanfhere) 안에 명령문을 넣어 세미콜론을 절약 할 수 있다는 것을 잊지 마십시오. main의 첫 번째 매개 변수를 저렴한 int 선언으로 사용하면 대부분의 컴파일러에서 작동합니다. 또한 배열을 평평하게하여 비트를 절약 할 수 있습니다 (인쇄 루프를 확실히 도와야 함)
Dave

@ 데이브 맞습니다. 이 코드를 작성한 후 조금 배웠습니다. 1D 배열에 데이터를 저장하면 많은 비용을 절약하는 데 도움이 될 것이라고 생각하지만 분명히 아이디어를 복사하고 싶지 않습니다. 나중에 할 수있는 일을 볼 수 있습니다. 감사!
Jacajack

0

파이썬 2, 158 바이트

온라인으로 사용해보십시오 . 간단한 재귀 솔루션

a,X,Y=input()
M=len(a)
N=len(a[0])
def R(x,y):
 if~0<x<M and~0<y<N and a[x][y]:a[x][y]=0;R(x-1,y);R(x+1,y);R(x,y-1);R(x,y+1)
R(X,Y)
print'\n'.join(map(str,a))

행 열 순서로 0 인덱스

1-빈 공간, 0-채워진 공간

입력을 1과 0의 배열과 두 개의 숫자의 배열로 취합니다.


0

Perl 5 , 129 + 1 (-a) = 130 바이트

sub f{my($r,$c)=@_;$a[$r][$c]eq$"&&($a[$r][$c]=X)&&map{f($r+$_,$c);f($r,$c+$_)}-1,1}@a=map[/./g],<>;f$F[0]+1,$F[1]+1;say@$_ for@a

온라인으로 사용해보십시오!

어떻게?

sub f{   # recursive subroutine
  my($r,$c)=@_; # taking row and column as inputs
  $a[$r][$c]eq$"&&  # using Boolean short circuit as an 'if' statement to 
                    # check if the current position in the global array is blank
  ($a[$r][$c]=X)&&  # then setting it to 'X'
  map{f($r+$_,$c);f($r,$c+$_)}-1,1 # and checking the four surrounding spaces
}
# -a command line option implicitly splits the first line into the @F array
@a=map[/./g],<>;    # put the input in a 2-D array
f$F[0]+1,$F[1]+1;   # start the fill at the given position, correcting for
                    # Perl's 0 based arrays
say@$_ for@a        # output the resulting pattern
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.