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] = '.';
}
[[problem:BOARDCOVER2]]
제 생각대로 했는데, 예제도 나오지 않아..
책에있는 솔루션을 그대로 써서 작성했는데도
두번째 예제가 엄청 오래걸리네요..
skan1543
[[problem:BOARDCOVER2]]
제 생각대로 했는데, 예제도 나오지 않아..
책에있는 솔루션을 그대로 써서 작성했는데도
두번째 예제가 엄청 오래걸리네요..
다른 코드는 불필요 할것같아
탐색을 수행하는 함수부분만 올립니다.
vector< vector< pair > > blocks에.. 책에있는것처럼 퍼즐블록의 제일 상단왼쪽의 #을 기준으로, # 들의 상대좌표들을 저장하였고. char board[][]에 보드판의 정보가 들어있습니다.
현재 보드판에 제일 상단 왼쪽의 빈공간을 찾아준뒤 그 공간을 기준으로 둘수있는 방향을 체크하면서, 가능하다면 두어보면서 탐색하고
마지막에 칸을 비우고 한번 더 탐색하는것까지..
책에있는것이랑 비슷하게 구현하였는데 왜 예제도 안나오는것일까요?
10년 전