제민
20061 모노미노도미노 2 본문
https://www.acmicpc.net/problem/20061
20061번: 모노미노도미노 2
모노미노도미노는 아래와 같이 생긴 보드에서 진행되는 게임이다. 보드는 빨간색 보드, 파란색 보드, 초록색 보드가 그림과 같이 붙어있는 형태이다. 게임에서 사용하는 좌표 (x, y)에서 x는 행,
www.acmicpc.net
이런 깡구현 문제들이 너무 좋다. 어떻게든 구현해내면 통과하기 때문에 다른 문제들보단 확실히 수월한 느낌이다. 물론 요령 없이 만들다보니 시간이 많이 든다...
문제를 풀 때 10x10 배열을 선언해서 해결했는데
vector을 사용했더라면 좀 더 쉽게 할 수 있지 않았을까 싶다.
#include <bits/stdc++.h>
using namespace std;
int board[10][10];
int n,ans;
void place(int type,int y, int x){
if(type==1){ //1x1 (세로 가로)
int g_max=-1; //초록쪽 이동
for(int i=4;i<=9;i++){
if(board[i][x]==0) g_max=i;
else break;
} board[g_max][x]=1;
int r_max=-1; //파랑쪽 이동
for(int i=4;i<=9;i++){
if(board[y][i]==0) r_max=i;
else break;
} board[y][r_max]=1;
}
if(type==2){ //1x2 (세로 가로)
int g_max=-1; //초록 이동
for(int i=4;i<=9;i++){
if(board[i][x]==0 && board[i][x+1]==0) g_max=i;
else break;
} board[g_max][x]=1; board[g_max][x+1]=1;
int r_max=-1; //파랑쪽 이동 (사실상 1x1과 같음)
for(int i=4;i<=9;i++){
if(board[y][i]==0) r_max=i;
else break;
} board[y][r_max-1]=1; board[y][r_max]=1;
}
if(type==3){ //2x1 (세로 가로)
int g_max=-1;
for(int i=4;i<=9;i++){
if(board[i][x]==0) g_max=i;
else break;
} board[g_max-1][x]=1; board[g_max][x]=1;
int r_max=-1;
for(int i=4;i<=9;i++){
if(board[y][i]==0 && board[y+1][i]==0) r_max=i;
else break;
} board[y][r_max]=1; board[y+1][r_max]=1;
}
}
void chkGreen(){
bool check=true;
while(check){
check=false;
for(int i=9;i>=6;i--){
if(board[i][0]&&board[i][1]&&board[i][2]&&board[i][3]){
ans++;
for(int k=i;k>=5;k--){
board[k][0]=board[k-1][0];
board[k][1]=board[k-1][1];
board[k][2]=board[k-1][2];
board[k][3]=board[k-1][3];
}
board[4][0]=0; board[4][1]=0; board[4][2]=0; board[4][3]=0;
check=true;
break;
}
}
}
//연한 칸 처리
for(int i=5;i>=4;i--){
int temp[4]={0,0,0,0};
if(board[i][0]||board[i][1]||board[i][2]||board[i][3]){
temp[0]=board[i][0]; temp[1]=board[i][1];
temp[2]=board[i][2]; temp[3]=board[i][3];
board[i][0]=board[i][1]=board[i][2]=board[i][3]=0; //초기화
}
else break;
for(int k=9;k>=7;k--){
board[k][0]=board[k-1][0];
board[k][1]=board[k-1][1];
board[k][2]=board[k-1][2];
board[k][3]=board[k-1][3];
}
board[6][0]=temp[0];
board[6][1]=temp[1];
board[6][2]=temp[2];
board[6][3]=temp[3];
}
}
void chkBlue(){
bool check=true;
while(check){
check=false;
for(int i=9;i>=6;i--){
if(board[0][i]&&board[1][i]&&board[2][i]&&board[3][i]){
ans++;
for(int k=i;k>=5;k--){
board[0][k]=board[0][k-1];
board[1][k]=board[1][k-1];
board[2][k]=board[2][k-1];
board[3][k]=board[3][k-1];
}
board[0][4]=0; board[1][4]=0; board[2][4]=0; board[3][4]=0;
check=true;
break;
}
}
}
//연한 칸 처리
for(int i=5;i>=4;i--){
int temp[4]={0,0,0,0};
if(board[0][i]||board[1][i]||board[2][i]||board[3][i]){
temp[0]=board[0][i]; temp[1]=board[1][i];
temp[2]=board[2][i]; temp[3]=board[3][i];
board[0][i]=board[1][i]=board[2][i]=board[3][i]=0; //초기화
}
else break;
for(int k=9;k>=7;k--){
board[0][k]=board[0][k-1];
board[1][k]=board[1][k-1];
board[2][k]=board[2][k-1];
board[3][k]=board[3][k-1];
}
board[0][6]=temp[0];
board[1][6]=temp[1];
board[2][6]=temp[2];
board[3][6]=temp[3];
}
}
int main() {
ios::sync_with_stdio(0);
cin>>n;
while(n--){
int t,x,y; cin>>t>>x>>y;
place(t,x,y);
chkGreen();
chkBlue();
}
int cnt=0;
for(int i=4;i<=9;i++){
for(int j=0;j<=3;j++){
if(board[i][j]) cnt++;
if(board[j][i]) cnt++;
}
}
cout<<ans<<'\n'<<cnt<<'\n';
return 0;
}
'코테연습일지 > 구현 (시뮬레이션)' 카테고리의 다른 글
17825 주사위 윷놀이 (0) | 2024.03.04 |
---|---|
19235 모노미노도미노 (0) | 2024.03.03 |
19236 청소년 상어 (0) | 2024.02.24 |
17140 이차원 배열과 연산 (0) | 2024.02.24 |
16236 아기 상어 (0) | 2024.02.24 |