BOJ 11559. Puyo Puyo
๐โโ๏ธ[Gold IV] Puyo Puyo - 11559
์ฑ๋ฅ ์์ฝ
๋ฉ๋ชจ๋ฆฌ: 2024 KB, ์๊ฐ: 0 ms
๋ถ๋ฅ
๋๋น ์ฐ์ ํ์, ๊ทธ๋ํ ์ด๋ก , ๊ทธ๋ํ ํ์, ๊ตฌํ, ์๋ฎฌ๋ ์ด์
์ ์ถ ์ผ์
2024๋ 2์ 21์ผ 15:17:30
๋ฌธ์ ์ค๋ช
๋ฟ์๋ฟ์์ ๋ฃฐ์ ๋ค์๊ณผ ๊ฐ๋ค.
ํ๋์ ์ฌ๋ฌ ๊ฐ์ง ์๊น์ ๋ฟ์๋ฅผ ๋๋๋ค. ๋ฟ์๋ ์ค๋ ฅ์ ์ํฅ์ ๋ฐ์ ์๋์ ๋ฐ๋ฅ์ด๋ ๋ค๋ฅธ ๋ฟ์๊ฐ ๋์ฌ ๋๊น์ง ์๋๋ก ๋จ์ด์ง๋ค.
๋ฟ์๋ฅผ ๋๊ณ ๋ ํ, ๊ฐ์ ์ ๋ฟ์๊ฐ 4๊ฐ ์ด์ ์ํ์ข์ฐ๋ก ์ฐ๊ฒฐ๋์ด ์์ผ๋ฉด ์ฐ๊ฒฐ๋ ๊ฐ์ ์ ๋ฟ์๋ค์ด ํ๊บผ๋ฒ์ ์์ด์ง๋ค. ์ด๋ 1์ฐ์๊ฐ ์์๋๋ค.
๋ฟ์๋ค์ด ์์ด์ง๊ณ ๋์ ์์ ๋ค๋ฅธ ๋ฟ์๋ค์ด ์๋ค๋ฉด, ์ญ์ ์ค๋ ฅ์ ์ํฅ์ ๋ฐ์ ์ฐจ๋ก๋๋ก ์๋๋ก ๋จ์ด์ง๊ฒ ๋๋ค.
์๋๋ก ๋จ์ด์ง๊ณ ๋์ ๋ค์ ๊ฐ์ ์์ ๋ฟ์๋ค์ด 4๊ฐ ์ด์ ๋ชจ์ด๊ฒ ๋๋ฉด ๋ ํฐ์ง๊ฒ ๋๋๋ฐ, ํฐ์ง ํ ๋ฟ์๋ค์ด ๋ด๋ ค์ค๊ณ ๋ค์ ํฐ์ง์ ๋ฐ๋ณตํ ๋๋ง๋ค 1์ฐ์์ฉ ๋์ด๋๋ค.
ํฐ์ง ์ ์๋ ๋ฟ์๊ฐ ์ฌ๋ฌ ๊ทธ๋ฃน์ด ์๋ค๋ฉด ๋์์ ํฐ์ ธ์ผ ํ๊ณ ์ฌ๋ฌ ๊ทธ๋ฃน์ด ํฐ์ง๋๋ผ๋ ํ๋ฒ์ ์ฐ์๊ฐ ์ถ๊ฐ๋๋ค.
๋จ๊ท๋ ์ต๊ทผ ๋ฟ์๋ฟ์ ๊ฒ์์ ํน ๋น ์ก๋ค. ์ด ๊ฒ์์ 1:1๋ก ๋ถ๋ ๋์ ๊ฒ์์ด๋ผ ์ ์๋ ๊ฒ๋ ์ค์ํ์ง๋ง, ์๋๋ฐฉ์ด ํฐ๋จ๋ฆฐ๋ค๋ฉด ์ฐ์๊ฐ ๋ช ๋ฒ์ด ๋ ์ง ๋ฐ๋ก ํ์ ํ ์ ์๋ ๋ฅ๋ ฅ๋ ํ์ํ๋ค. ํ์ง๋ง ์์ง ์ค๋ ฅ์ด ๋ถ์กฑํ์ฌ ๋จ๊ท๋ ์๊ธฐ ํ๋์๋ง ์ ๊ฒฝ ์ฐ๊ธฐ ๋ฐ์๋ค. ์๋๋ฐฉ์ ํ๋๊ฐ ์ฃผ์ด์ก์ ๋, ์ฐ์๊ฐ ๋ช ๋ฒ ์ฐ์์ผ๋ก ์ผ์ด๋ ์ง ๊ณ์ฐํ์ฌ ๋จ๊ท๋ฅผ ๋์์ฃผ์!
์ ๋ ฅ
์ด 12๊ฐ์ ์ค์ ํ๋์ ์ ๋ณด๊ฐ ์ฃผ์ด์ง๋ฉฐ, ๊ฐ ์ค์๋ 6๊ฐ์ ๋ฌธ์๊ฐ ์๋ค.
์ด๋ .
์ ๋น๊ณต๊ฐ์ด๊ณ .
์ด ์๋๊ฒ์ ๊ฐ๊ฐ์ ์๊น์ ๋ฟ์๋ฅผ ๋ํ๋ธ๋ค.
R
์ ๋นจ๊ฐ, G
๋ ์ด๋ก, B
๋ ํ๋, P
๋ ๋ณด๋ผ, Y
๋ ๋
ธ๋์ด๋ค.
์ ๋ ฅ์ผ๋ก ์ฃผ์ด์ง๋ ํ๋๋ ๋ฟ์๋ค์ด ์ ๋ถ ์๋๋ก ๋จ์ด์ง ๋ค์ ์ํ์ด๋ค. ์ฆ, ๋ฟ์ ์๋์ ๋น ์นธ์ด ์๋ ๊ฒฝ์ฐ๋ ์๋ค.
์ถ๋ ฅ
ํ์ฌ ์ฃผ์ด์ง ์ํฉ์์ ๋ช์ฐ์๊ฐ ๋๋์ง ์ถ๋ ฅํ๋ค. ํ๋๋ ํฐ์ง์ง ์๋๋ค๋ฉด 0์ ์ถ๋ ฅํ๋ค.
๐ํ์ด
๋์์ ๋ฟ์๊ฐ ํฐ์ง ๋ ์ฐ์๊ฐ ๊ทธ ๊ฐ์๋งํผ ๋์ด๋๋๊ฒ ์๋๋ผ ํ๋๋ง ๋์ด๋์ผํ๋ค.
๋จผ์ ์ ๋ ฅ ๊ฐ์ ๋ฐ๋๋ค.
bool flag = false;
int boomCnt = 0, maxBoomCnt = 0;
char board[13][7];
int visited[13][7];
int dy[] = { -1, 0, 1, 0 };
int dx[] = { 0, 1, 0, -1 };
void setting()
{
for (int i = 1; i <= 12; ++i)
{
for (int j = 1; j <= 6; ++j)
{
cin >> board[i][j];
}
}
}
4๊ฐ ์ด์ ์ฐ๊ฒฐ๋์ด ์๋์ง ํ์ธํ๊ธฐ ์ํด์ BFS๋ฅผ ๋ง๋ ๋ค.
void BFS(int y, int x)
{
vector<pair<int, int>> boomList;
queue<pair<int, int>> q;
if (visited[y][x] == false && board[y][x] != '.')
{
q.push({ y, x });
visited[y][x] = 1;
}
pair<int, int> here;
while (q.empty() == false)
{
here = q.front();
q.pop();
boomList.push_back(here);
for (int i = 0; i < 4; ++i)
{
int ny = here.first + dy[i];
int nx = here.second + dx[i];
if (ny < 1 || nx < 1 || ny > 12 || nx > 6)
continue;
if (visited[ny][nx] == 1)
continue;
if (board[ny][nx] != board[here.first][here.second])
continue;
q.push({ ny, nx });
visited[ny][nx] = 1;
}
}
if (boomList.size() >= 4)
{
// ์ฐ์ ์์
for (int i = 0; i < boomList.size(); ++i)
{
board[boomList[i].first][boomList[i].second] = '.';
}
flag = true;
//boomCnt++;
//maxBoomCnt = max(maxBoomCnt, boomCnt);
}
}
์ ์ผ ์ฒ์ ๋งํ๊ฑฐ์ฒ๋ผ ํฐํธ๋ฆฐ ๋ฟ์ ์๋งํผ ๋์ด๋๋๊ฒ ์๋๋ผ์ flag๋ง ๋ฐ๊ฟ์ค๋ค.
๋ฟ์๋ฅผ ํฐํธ๋ฆฌ๋ฉด ์ค๋ ฅ์ ์ํฅ์ผ๋ก ์๋๋ก ๋จ์ด์ง๋๋ฐ ์๋์ ๊ฐ์ด ๊ตฌํํ๋ค.
void move(int y, int x)
{
char ch = board[y][x];
while (true)
{
int ny = y + 1;
if (board[ny][x] != '.')
break;
board[y][x] = '.';
board[ny][x] = ch;
y = ny;
}
}
ํ ์ฌ์ดํด์ด ๋๋๋ฉด visited๋ฅผ ์ด๊ธฐํํด์ผํ๋ค.
๊ทธ๋ฆฌ๊ณ ๊ฒ์ ์ํฉ์ ๋ณด๊ธฐ ์ํ printBoardํจ์๋ฅผ ๋ง๋ค์๋ค.
void visitedClear()
{
for (int i = 1; i <= 12; ++i)
{
for (int j = 1; j <= 6; ++j)
{
visited[i][j] = 0;
}
}
}
void printBoard()
{
for (int i = 1; i <= 12; ++i)
{
for (int j = 1; j <= 6; ++j)
{
cout << board[i][j] << " ";
}
cout << endl;
}
cout << endl;
}
๊ฒ์์ ์์ํ๋ ํจ์๋ก ์์ ํจ์๋ค์ ์ข ํฉํด์ ๋ง๋ ๋ค.
void gameStart()
{
while (true)
{
//printBoard();
for (int i = 1; i <= 12; ++i)
{
for (int j = 1; j <= 6; ++j)
{
BFS(i, j);
}
}
//printBoard();
// flag๊ฐ ์ผ์ง๋ฉด ํฐํธ๋ฆฐ ๋ฟ์๊ฐ ์๋ค๋ ๋ป
if (flag == true)
boomCnt++;
// ๋ฐ์์ ๋ถํฐ ์์ง์ฌ์ผํ๋ฏ๋ก i๊ฐ 12๋ถํฐ ์ํํ๋ค.
for (int i = 12; i >= 1; --i)
{
for (int j = 1; j <= 6; ++j)
{
move(i, j);
}
}
//printBoard();
visitedClear();
if (flag == false)
break;
flag = false;
//cout << boomCnt << " " << maxBoomCnt << endl;
}
}
void solve()
{
setting();
gameStart();
cout << boomCnt;
}
๋ฌธ์ ์ ์ ๋ ฅ๊ฐ์ผ๋ก ์ฝ๋๋ฅผ ๋๋ฆฌ๋ฉด ์๋์ ๊ฐ์ด ๋๋ค.
๐์ ์ฒด ์ฝ๋
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include<iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#include <math.h>
#include <queue>
// ๋ฟ์๋ฟ์
// ๊ฐ์ ์ ๋ฟ์๊ฐ 4๊ฐ ์ด์ ์ํ์ข์ฐ๋ก ์ฐ๊ฒฐ๋์ด ์์ผ๋ฉด ํ๊บผ๋ฒ์ ์์ด์ง๋ค. -> BFS
// ์ด ๋ 1์ฐ์๊ฐ ์์
// ์ค๋ ฅ์ ํญ์ ์ ์ฉ
// ์์ R, G, B, P, Y
// ๋น๊ณต๊ฐ์ .
// ๋ช ์ฐ์๊ฐ ์ผ์ด๋๋์ง ์์๋ด๋๊ฒ์ด ๋ชฉํ
using namespace std;
void setting();
void BFS(int y, int x);
void move(int y, int x);
void visitedClear();
void printBoard();
void gameStart();
void solve();
bool flag = false;
int boomCnt = 0, maxBoomCnt = 0;
char board[13][7];
int visited[13][7];
int dy[] = { -1, 0, 1, 0 };
int dx[] = { 0, 1, 0, -1 };
vector<vector<char>> puyoes;
void setting()
{
for (int i = 1; i <= 12; ++i)
{
for (int j = 1; j <= 6; ++j)
{
cin >> board[i][j];
if (board[i][j] != '.')
{
puyoes.push_back({ board[i][j] });
}
}
}
}
void BFS(int y, int x)
{
vector<pair<int, int>> boomList;
queue<pair<int, int>> q;
if (visited[y][x] == false && board[y][x] != '.')
{
q.push({ y, x });
visited[y][x] = 1;
}
pair<int, int> here;
while (q.empty() == false)
{
here = q.front();
q.pop();
boomList.push_back(here);
for (int i = 0; i < 4; ++i)
{
int ny = here.first + dy[i];
int nx = here.second + dx[i];
if (ny < 1 || nx < 1 || ny > 12 || nx > 6)
continue;
if (visited[ny][nx] == 1)
continue;
if (board[ny][nx] != board[here.first][here.second])
continue;
q.push({ ny, nx });
visited[ny][nx] = 1;
}
}
if (boomList.size() >= 4)
{
// ์ฐ์ ์์
for (int i = 0; i < boomList.size(); ++i)
{
board[boomList[i].first][boomList[i].second] = '.';
}
flag = true;
//boomCnt++;
//maxBoomCnt = max(maxBoomCnt, boomCnt);
}
}
void move(int y, int x)
{
char ch = board[y][x];
while (true)
{
int ny = y + 1;
if (board[ny][x] != '.')
break;
board[y][x] = '.';
board[ny][x] = ch;
y = ny;
}
}
void visitedClear()
{
for (int i = 1; i <= 12; ++i)
{
for (int j = 1; j <= 6; ++j)
{
visited[i][j] = 0;
}
}
}
void printBoard()
{
for (int i = 1; i <= 12; ++i)
{
for (int j = 1; j <= 6; ++j)
{
cout << board[i][j] << " ";
}
cout << endl;
}
cout << endl;
}
void gameStart()
{
while (true)
{
//printBoard();
for (int i = 1; i <= 12; ++i)
{
for (int j = 1; j <= 6; ++j)
{
BFS(i, j);
}
}
//printBoard();
if (flag == true)
boomCnt++;
for (int i = 12; i >= 1; --i)
{
for (int j = 1; j <= 6; ++j)
{
move(i, j);
}
}
//printBoard();
visitedClear();
if (flag == false)
break;
flag = false;
//cout << boomCnt << " " << maxBoomCnt << endl;
}
}
void solve()
{
setting();
gameStart();
cout << boomCnt;
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
freopen("input.txt", "rt", stdin);
solve();
return 0;
}