borderCover 재귀적 중복문제?

  • fkdlslss
    fkdlslss

    재귀적으로 모든 경우에 대해서 책에 나온것처럼 비어있는 칸중에
    가장 위에서 왼쪽에 있는 경우부터 4가지 경우에 대해서 재귀적으로
    작동하도록 만들었는데 .. 어느부분이 문제인지를 잡아내지 못하고 있습니다... ㅠㅠ 코드 한번 봐주시면 정말 감사하겠습니다.
    문제가 있는 부분을 찝어서 여쭈어 보고싶은데 찾지를 못하겠습니다 ㅠㅠ

    #include<stdio.h>
    #include<string.h>
    #include<iostream>
    
    using namespace std;
    
    bool check[21][21];
    int answer;
    int height;
    int width;
    
    int fill(int a,int b, int c);
    
    int main(){
        int testCase;
        cin >>testCase;
       // scanf("%d" , &testCase);
    
        while(testCase--){
            answer = 0;
            memset(check,true,sizeof(check));
    
            scanf("%d %d",&height ,&width);
            int zero=0;
            for(int i=1;i<=height;i++){
                for(int j=1;j<=width;j++){
                    char a;
                    scanf(" %c" , &a);
                    if(a == '.'){
                        zero++;
                    }else{
                        check[i][j] = false;
                    }
                }
            }
    
            if(zero%3!=0){
                printf("0\n");
                break;
            }
    
            for(int i=1;i<=height;i++){
                for(int j=1;j<=width;j++){
                    if(check[i][j] == true){
                        check[i][j] = false;
                        fill(i,j,zero);     //zero는 비어있는 숫자
                    }
                }
            }
    
    
            printf("%d\n" , answer);
    
    
        }
    }
    
    int fill(int a, int b,int c){
        if(c == 0){
            answer++;
            return 0;
        }
        if(a<1 || b<1){
            return 0;
        }
    
        if(a>height || b>width){
            return 0;
        }
    
        if(check[a][b+1]==true && check[a+1][b+1] == true){
            check[a][b+1] = false;
            check[a+1][b+1] = false;
            fill(a,b+2,c-3);
            check[a][b+1] = true;
            check[a+1][b+1] = true;
    
        }
        if(check[a+1][b]==true && check[a+1][b+1] == true){
            check[a+1][b] = false;
            check[a+1][b+1] = false;
            fill(a,b+1,c-3);
            check[a+1][b] = true;
            check[a+1][b+1] = true;
    
        }if(check[a+1][b]==true && check[a+1][b-1] == true){
            check[a+1][b] = false;
            check[a+1][b-1] = false;
            fill(a,b+1,c-3);
            check[a+1][b] = true;
            check[a+1][b-1] = true;
    
        }if(check[a][b+1]==true && check[a+1][b] == true){
            check[a][b+1] = false;
            check[a+1][b] = false;
            fill(a,b+2,c-3);
            check[a][b+1] = true;
            check[a+1][b] = true;
        }
        return 0;
    }
    

    8년 전
0개의 댓글이 있습니다.
  • 정회원 권한이 있어야 커멘트를 다실 수 있습니다. 정회원이 되시려면 온라인 저지에서 5문제 이상을 푸시고, 가입 후 7일 이상이 지나셔야 합니다. 현재 문제를 푸셨습니다.