boardcover 문제...

  • swon31
    swon31

    예제에 대해선 값이 제대로 나오는데 어디가 틀린 건지 오류가 계속 뜨네요... 혹시 정답 맞추신 분 게시면 다른 경우 값 얻을 수 있을까요?

    #include <iostream>
    
    using namespace std;
    
    int H, W;
    bool board[20][20];
    int whiteCount = 0;
    int fillCount = 0;
    
    int fill();
    int fill(int i, int j, int shape) {
    
        switch (shape) {
        case 1: {
            if (i + 1 >= H || j + 1 >= W)   return 0;
            if (board[i][j] & board[i + 1][j] & board[i + 1][j + 1]) {
                board[i][j] = board[i + 1][j] = board[i + 1][j + 1] = false;
                whiteCount--;
                whiteCount--;
                whiteCount--;
                fill();
                return 1;
            }
            return 0;
            break;
        }
        case 2: {
            if (i + 1 >= H || j - 1 <= 0)   return 0;
            if (board[i][j] & board[i + 1][j] & board[i + 1][j - 1]) {
                board[i][j] = board[i + 1][j] = board[i + 1][j - 1] = false;
                whiteCount--;
                whiteCount--;
                whiteCount--;
                fill();
                return 1;
            }
            return 0;
            break;
        }
        case 3: {
            if (i + 1 >= H || j + 1 >= W)   return 0;
            if (board[i][j] & board[i][j + 1] & board[i + 1][j + 1]) {
                board[i][j] = board[i][j + 1] = board[i + 1][j + 1] = false;
                whiteCount--;
                whiteCount--;
                whiteCount--;
                fill();
                return 1;
            }
            return 0;
            break;
        }
        case 4: {
            if (i + 1 >= H || j + 1 >= W)   return 0;
            if (board[i][j] & board[i][j + 1] & board[i + 1][j]) {
                board[i][j] = board[i][j + 1] = board[i + 1][j] = false;
                whiteCount--;
                whiteCount--;
                whiteCount--;
                fill();
                return 1;
            }
            return 0;
            break;
        }
        default:
            break;
        }
    }
    
    int unfill(int i, int j, int shape) {
        switch (shape) {
        case 1: {
            board[i][j] = board[i + 1][j] = board[i + 1][j + 1] = true;
            whiteCount++;
            whiteCount++;
            whiteCount++;
            return 0;
        }
        case 2: {
            board[i][j] = board[i + 1][j] = board[i + 1][j - 1] = true;
            whiteCount++;
            whiteCount++;
            whiteCount++;
            return 0;
        }
        case 3: {
            board[i][j] = board[i][j + 1] = board[i + 1][j + 1] = true;
            whiteCount++;
            whiteCount++;
            whiteCount++;
            return 0;
        }
        case 4: {
            board[i][j] = board[i][j + 1] = board[i + 1][j] = true;
            whiteCount++;
            whiteCount++;
            whiteCount++;
            return 0;
        }
        default:
            break;
        }
    }
    
    int fill() {
        int i, j;
        bool flag = false;
        for (i = 0; i < H; i++) {   //왼쪽 위 찾기
            for (j = 0; j < W; j++) {
                if (board[i][j] == true) {
                    flag = true;
                    break;
                }
            }
            if (flag) break;
        }
        if (whiteCount == 0) {  //다 채워짐
            fillCount++;
            return 1;
        }
        if (fill(i, j, 1))  unfill(i, j, 1);
        if (fill(i, j, 2))  unfill(i, j, 2);
        if (fill(i, j, 3))  unfill(i, j, 3);
        if (fill(i, j, 4))  unfill(i, j, 4);
        return 0;
    }
    
    int boardCover() {
        fillCount = 0;
        whiteCount = 0;
        for (int i = 0; i < H; i++) {   //흰칸 갯수 세기
            for (int j = 0; j < W; j++) {
                if (board[i][j] == true)    whiteCount++;
            }
        }
        if (whiteCount % 3 != 0)    return 0;
        fill();
        return fillCount;
    }
    
    int main(void) {
        int num;
    
    
        cin >> num; //반복 횟수
        for (int i = 0; i < num; i++) {
            cin >> H;   //게임판의 세로 가로
            cin >> W;
            for (int i = 0; i < 20; i++) {  //초기화
                for (int j = 0; j < 20; j++) {
                    board[i][j] = false;
                }
            }
            for (int i = 0; i < H; i++) {   //보드 만들기
                for (int j = 0; j < W; j++) {
                    char input;
                    cin >> input;
                    if (input == '#')       board[i][j] = false;
                    else if (input == '.')  board[i][j] = true;
                }
            }
            cout << boardCover() << endl;
        }
        return 0;
    }
    

    8년 전
2개의 댓글이 있습니다.
  • JongMan
    JongMan

    이 부분이 유일한 틀린 부분인지는 모르겠지만,

    if (i + 1 >= H || j - 1 <= 0)   return 0;

    은 확실히 틀렸네요.


    8년 전 link
  • swon31
    swon31

    ㄴ 앗 감사합니다!! 덕분에 풀었어요 다음부턴 코드를 더 꼼꼼히 봐야겠네요 ㅠㅠㅠ


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