※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 25331번 문제인 Drop 7이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/25331
25331번: Drop 7
Drop7은 7×7 크기의 격자에서 진행하는 싱글 플레이어 게임이다. 처음에는 격자가 비어있고, 플레이어는 매 턴마다 1 이상 7 이하의 정수 하나가 적힌 공을 받아 7개의 열 중 한 곳에 떨어뜨려야 한
www.acmicpc.net
문제에서 주어진 Drop 7 게임의 일부를 직접 구현해 시뮬레이션을 돌리는 문제이다.
글쓴이는 다음과 같은 과정을 구현해 문제를 해결했다.
(1) 각 열에 주어진 공을 집어넣는 시도를 한 번씩 한다. 아래부터는 열을 하나 정해 공을 넣은 상황이다.
(2) 각 행과 열을 둘러보면서, 이번 차례에 지워질 공이 무엇인지를 찾아내 별도의 배열에 기록한다.
(3) 지워질 공을 기록한 배열을 참조해, 이번 차례에 지워질 공들을 지운다. 이 과정에서 지워진 공이 있는지의 여부를 기록해둔다.
(4) 공들을 아래로 내린다.
(5) (3)에서 이번 차례에 지워진 공이 있었다면 (2)로 돌아간다.
(6) 남아있는 공의 개수를 센다.
(4)에서 내릴 공이 없더라도 지워진 공이 있었다면 (2)로 돌아가 확인해볼 필요가 있다는 점에 유의하자.
아래는 제출한 소스코드이다.
#include <iostream>
#include <cstring>
using namespace std;
int K;
int original[7][7];
int board[7][7];
int deleted[7][7];
int ans = 1000000007;
void func(int col) {
for (int r = 0; r < 7; r++) {
for (int c = 0; c < 7; c++) board[r][c] = original[r][c];
}
for (int r = 6; r > -1; r--) {
if (board[r][col]) continue;
board[r][col] = K;
break;
}
bool chk = 1;
while (chk) {
chk = 0;
memset(deleted, 0, sizeof(deleted));
for (int r = 0; r < 7; r++) {
int cL = 0, combo = 0;
for (int c = 0; c < 7; c++) {
if (board[r][c]) combo++;
else {
for (int cc = cL; cc < c; cc++) {
if (board[r][cc] == combo) deleted[r][cc] = 1;
}
cL = c + 1, combo = 0;
}
}
for (int cc = cL; cc < 7; cc++) {
if (board[r][cc] == combo) deleted[r][cc] = 1;
}
}
for (int c = 0; c < 7; c++) {
int rL = 0, combo = 0;
for (int r = 0; r < 7; r++) {
if (board[r][c]) combo++;
else {
for (int rr = rL; rr < r; rr++) {
if (board[rr][c] == combo) deleted[rr][c] = 1;
}
rL = r + 1, combo = 0;
}
}
for (int rr = rL; rr < 7; rr++) {
if (board[rr][c] == combo) deleted[rr][c] = 1;
}
}
for (int r = 0; r < 7; r++) {
for (int c = 0; c < 7; c++) {
if (deleted[r][c]) chk = 1, board[r][c] = 0;
}
}
for (int c = 0; c < 7; c++) {
for (int r = 6; r > -1; r--) {
if (board[r][c]) {
int rr = r + 1;
while (rr < 7 && board[rr][c] == 0) {
board[rr][c] = board[rr - 1][c];
board[rr - 1][c] = 0;
rr++;
}
}
}
}
}
int cnt = 0;
for (int r = 0; r < 7; r++) {
for (int c = 0; c < 7; c++) {
if (board[r][c]) cnt++;
}
}
ans = min(ans, cnt);
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
for (int r = 0; r < 7; r++) {
for (int c = 0; c < 7; c++) cin >> original[r][c];
}
cin >> K;
for (int col = 0; col < 7; col++) func(col);
cout << ans;
}
'BOJ' 카테고리의 다른 글
[BOJ 7580 // C++] Team Selection (1) | 2023.04.11 |
---|---|
[BOJ 25323 // C++] 수 정렬하기, 근데 이제 제곱수를 곁들인 (0) | 2023.04.10 |
[BOJ 25330 // C++] SHOW ME THE DUNGEON (0) | 2023.04.08 |
[BOJ 25332 // C++] 수들의 합 8 (0) | 2023.04.07 |
[BOJ 2268 // C++] 수들의 합 7 (0) | 2023.04.06 |