boardcover2 왜 예제도 제때 못계산하는걸까요..

  • skan1543
    skan1543
    void check(int count)
    {
        int x, y = -1;
        for (int i = 0; i < H; i++)
        {
            for (int j = 0; j < W; j++)
            {
                if (board[i][j] == '.')
                {
                    x = i;
                    y = j;
                    break;
                }
            }
            if (y != -1) break;
        }
        if (y == -1)
        {
            if (best < count) best = count;
            return;
        }
    
        int cnt = 0;
        for (int i = 0; i < H; i++)
            for (int j = 0; j <W; j++) if (board[i][j] != '#') cnt++;
        if ((cnt / cb)+count <= best) return;
    
        int imsi = blocks.size();
    
        for (int l = 0; l <imsi; l++)
        {
            int i;
            int tt = blocks[l].size();
            for (i = 0; i < tt; i++) 
                if (board[x + blocks[l][i].first][y + blocks[l][i].second] == '#' || x + blocks[l][i].first<0 || x + blocks[l][i].first>=H || y + blocks[l][i].second<0 || y + blocks[l][i].second>=W) break;
            if (i == tt)
            {
                for (i = 0; i <tt; i++) board[x + blocks[l][i].first][y + blocks[l][i].second] = '#';
                check(count+1);
                for (i = 0; i < tt; i++) board[x + blocks[l][i].first][y + blocks[l][i].second] = '.';
            }
        }
        board[x][y] = '@';
        check(count);
        board[x][y] = '.';
    }
    

    BOARDCOVER2

    제 생각대로 했는데, 예제도 나오지 않아..
    책에있는 솔루션을 그대로 써서 작성했는데도
    두번째 예제가 엄청 오래걸리네요..

    다른 코드는 불필요 할것같아

    탐색을 수행하는 함수부분만 올립니다.

    vector< vector< pair > > blocks에.. 책에있는것처럼 퍼즐블록의 제일 상단왼쪽의 #을 기준으로, # 들의 상대좌표들을 저장하였고. char board[][]에 보드판의 정보가 들어있습니다.

    현재 보드판에 제일 상단 왼쪽의 빈공간을 찾아준뒤 그 공간을 기준으로 둘수있는 방향을 체크하면서, 가능하다면 두어보면서 탐색하고

    마지막에 칸을 비우고 한번 더 탐색하는것까지..

    책에있는것이랑 비슷하게 구현하였는데 왜 예제도 안나오는것일까요?


    8년 전
1개의 댓글이 있습니다.
  • skan1543
    skan1543

    해결하였습니다.. 가지치기를 똑띠 해주니 되네요 ㅠㅠ


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