아무코딩

[백준 11559] Puyo Puyo 본문

알고리즘/백준

[백준 11559] Puyo Puyo

동 코 2020. 4. 25. 21:16

문제풀이

 

간단한 시뮬레이션 문제이다. 시뮬레이션을 오랜만에 풀어서 그런가.. visited 초기화를 매번해주지않아 빨리 풀 문제에 시간을 좀 쓴거같다. 덕분에 xcode에서 디버깅하는 법을 터득했다..

 

소스코드

더보기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
#include <iostream>
#include <stdio.h>
#include <string>
#include <vector>
 
#define ROW_SIZE 12
#define COL_SIZE 6
using namespace std;
 
int Map[ROW_SIZE][COL_SIZE];
 
int dir_row[4= {1,0,-1,0};
int dir_col[4= {0,-1,0,1};
bool visited[ROW_SIZE][COL_SIZE];
vector<pair<int,int>> sameGroup;
bool isChanged=false;
bool isPuyo(int next_row, int next_col){
    if(next_row<0||next_col<0||next_row>=ROW_SIZE||next_col>=COL_SIZE)
        return false;
    if(Map[next_row][next_col]=='.')
        return false;
    if(visited[next_row][next_col])
        return false;
    return true;
}
 
void dfs(int r, int c,int color){
    for(int i=0;i<4;i++){
        int next_row = r+ dir_row[i];
        int next_col = c + dir_col[i];
        
        if(isPuyo(next_row, next_col)){
            if(Map[next_row][next_col] == color){ //같은 경우
                visited[next_row][next_col] =true;
                sameGroup.push_back(make_pair(next_row,next_col));
                dfs(next_row,next_col,color);
            }
        }
    }
}
//void printMap(){
//    for(int i=0;i<ROW_SIZE;i++){
//        for(int j=0;j<COL_SIZE;j++){
//            printf("%3d ",Map[i][j]);
//        }
//        printf("\n");
//    }
//}
void eraseSameGroup() {
    for(int i=0;i<ROW_SIZE;i++){
        for(int j=0;j<COL_SIZE;j++){
            if(Map[i][j]>0&&!visited[i][j]){
                sameGroup.push_back(make_pair(i,j));
                visited[i][j]=true;
                dfs(i,j,Map[i][j]);
                if(sameGroup.size()>=4){
                    isChanged = true;
                    for(int k=0;k<sameGroup.size();k++){
                        int row = sameGroup[k].first;
                        int col = sameGroup[k].second;
                        Map[row][col]=-1;
                    }
//                    printf("\n한색삭제후\n");
//                    printMap();
                }
                sameGroup.clear();
            }
        }
    }
}
 
void arrangeCol(int r,int c){
    int cnt=0;
    for(int i=r;i>=0;i--){
        if(Map[i][c]==-1){
            cnt++;
        }
        else{
            break;
        }
    }
    for(int i=r;i>=0;i--){
        if(i-cnt>=0)
            Map[i][c] = Map[i-cnt][c];
        else
            Map[i][c]=0;
    }
}
void initVisited(){
    for(int i=0;i<ROW_SIZE;i++){
        for(int j=0;j<COL_SIZE;j++){
            visited[i][j] = false;
        }
    }
}
int main() {
    
    for(int i=0;i<ROW_SIZE;i++){
        for(int j=0;j<COL_SIZE;j++){
            char input;
            while(1){
                scanf("%c",&input);
                Map[i][j] = input;
                if(input == '.'){//빈공간
                    Map[i][j] = 0;
                    break;
                }
                else if(input>='A' && input<='Z'){//색
                    Map[i][j] = input-'A'+1;
                    break;
                }
            }
        }
    }
    //4개씩 dfs로 없애기
    int result=0;
    while(1){
        isChanged =false;
        initVisited();
        eraseSameGroup();
        if(!isChanged)
            break;
        result++;
//        printf("\n지운후\n");
//        printMap();
        for(int j=0;j<COL_SIZE;j++){
            for(int i=ROW_SIZE-1;i>=0;i--){
                if(Map[i][j]==-1){
                    arrangeCol(i,j);
                }
            }
        }
//        printf("\n정렬후\n");
//        printMap();
    }
    printf("%d\n",result);
    
    return 0;
}
 
 
 

문제 링크 : https://www.acmicpc.net/problem/11559

 

11559번: Puyo Puyo

현재 주어진 상황에서 몇연쇄가 되는지 출력하라. (하나도 터지지 않는다면 0을 출력하면 된다.)

www.acmicpc.net

 

'알고리즘 > 백준' 카테고리의 다른 글

[백준 14888] 연산자 끼워넣기  (0) 2020.04.28
[백준 2573] 빙산  (0) 2020.04.27
[백준 3190] 뱀  (0) 2020.04.22
[백준 14891] 톱니바퀴  (0) 2020.04.21
[백준 1991] 트리 순회  (0) 2020.04.17
Comments