// user 부분================================================================
int map[35][35], hint[5000][2][2], chk[5000];
int hn, empty, N, M;
char q[4][4];
void encode(char b[][65]) {
int i, j;
for (i = 0; i < M; i++) for (j = 0; j < M; j++) {
if (i == 0 || j == 0 || i == M - 1 || j == M - 1) map[i][j] = 0;
else map[i][j] = -1;
}
for (i = 0; i < N; i++)for (j = 0; j < N; j++) {
if (b[i][j] == '*') continue;
map[i / 2][j / 2] = map[i / 2][j / 2] * 16 + b[i][j] - 'A';
}
}
void encode(int h[2][2]) {
int i, j;
for (i = 0; i < 2; i++) for (j = 0; j < 2; j++)h[i][j] = 0;
for (i = 0; i < 4; i++) for (j = 0; j < 4; j++)
h[i / 2][j / 2] = h[i / 2][j / 2] * 16 + q[i][j] - 'A';
}
void decode(char b[][65]) {
int i, j;
for (i = N - 3; i >= 2; i--)for (j = N - 3; j >= 2; j--) {
b[i][j] = map[i / 2][j / 2] % 16 + 'A';
map[i / 2][j / 2] >>= 4;
}
}
extern void query(char sector[][4]);
void repair(int n, int m, char board[][65])
{
N = n, M = n / 2;
hn = 0, empty = (M - 2)*(M - 2);
encode(board);
int i, j;
for (i = 0; i < 5000; i++) chk[i] = 0;
for (i = 0; i < m; i++) {
query(q);
encode(hint[hn]);
if (same_chk()) continue;
chk[hn] = update(hint[hn], 0, 0, M - 1);
hn++;
if (empty * 20 <= M * M) break;
}
decode(board);
}
int update(int h[2][2], int sr, int sc, int len) {
int i, j, r, c, cnt;
for (i = sr; i < sr + len; i++) for (j = sc; j < sc + len; j++) {
cnt = 0;
for (r = 0; r < 2; r++) for (c = 0; c < 2; c++) {
if (map[i + r][j + c] == h[r][c]) cnt++;
}
if (cnt == 4) return 1;
if (cnt < 2) continue;
for (r = 0; r < 2; r++) for (c = 0; c < 2; c++) {
if (map[i + r][j + c] < 0) {
map[i + r][j + c] = h[r][c];
empty--;
}
}
for (int k = 0; k < hn; k++)
if(chk[k]==0) chk[k] = update(hint[k], i - 1, j - 1, 3);
return 1;
}
return 0;
}
int same_chk() {
for (int i = 0; i < hn; i++)
if (hint[i][0][0] == hint[hn][0][0] && hint[i][0][1] == hint[hn][0][1]) return 1;
return 0;
}
'삼성전자 알고리즘 > 정올' 카테고리의 다른 글
3240 : 회원 참여도 분석1 (0) | 2019.07.27 |
---|---|
16. 3181 : 족보 만들기 (0) | 2019.07.24 |
15. 3203 : 꿀벌의 여행 (0) | 2019.07.16 |
14. 1133 : Uniqueness (0) | 2019.06.28 |
13. 1726 : 구간의 최대값1 (0) | 2019.06.28 |