ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 백준 20061번 모노미도미노2
    PS 2021. 1. 28. 00:30

    www.acmicpc.net/problem/20061

     

    20061번: 모노미노도미노 2

    모노미노도미노는 아래와 같이 생긴 보드에서 진행되는 게임이다. 보드는 빨간색 보드, 파란색 보드, 초록색 보드가 그림과 같이 붙어있는 형태이다. 게임에서 사용하는 좌표 (x, y)에서 x는 행,

    www.acmicpc.net

     

    초록색 보드와 파란색 보드에 쓰이는 연산을 거의 동일한 코드로 구현할 수 있습니다.

     

    다만 사고실험이 조금 복잡했던 문제였습니다.

     

    정교한 사고실험과 설계-구현의 검증이 부족함을 느꼈습니다.


     

     

     

    <코드>

    #include <iostream>
    #include <algorithm>
    using namespace std;
    
    int green[7][5];
    int blue[7][5];
    int n, t, sy, sx;
    int score_line, score_line_cnt;
    bool scored;
    int res=0, res2=0;
    
    void print_green() {
    	for (int i = 0; i < 6; i++) {
    		for (int j = 0; j < 4; j++) {
    			cout << green[i][j] << ' ';
    		}
    		cout << '\n';
    	}
    }
    
    void print_blue() {
    	for (int i = 0; i < 6; i++) {
    		for (int j = 0; j < 4; j++) {
    			cout << blue[i][j] << ' ';
    		}
    		cout << '\n';
    	}
    }
    
    
    bool is_range(int y, int x) {
    	if (y < 0 || y >= 6 || x < 0 || x >= 4) return false;
    	return true;
    }
    
    void copy_map(int tmap[][5], int map[][5]) {
    	for (int i = 0; i < 6; i++) {
    		for (int j = 0; j < 4; j++) {
    			tmap[i][j] = map[i][j];
    		}
    	}
    }
    
    void pale_move(int map[][5]) {
    	int dep = 0;
    	for (int i = 0; i < 2; i++) {
    		for (int j = 0; j < 4; j++) {
    			if (map[i][j] == 1) {
    				dep++;
    				break;
    			}
    		}
    	}
    
    	if (dep == 0) return;
    
    	int tmap[7][5];
    
    	copy_map(tmap, map);
    
    	for (int i = 5; i >= 2; i--) {
    		for (int j = 0; j < 4; j++) {
    			map[i][j] = tmap[i - dep][j];
    		}
    	}
    	for (int i = 1; i >= 0; i--) {
    		for (int j = 0; j < 4; j++) {
    			map[i][j] = 0;
    		}
    	}
    }
    
    void falling_by_score(int map[][5]) {
    	int tmap[7][5];
    
    	copy_map(tmap, map);
    
    	for (int i = score_line; i >= 0; i--) {
    		if (i - score_line_cnt < 0) break;
    		for (int j = 0; j < 4; j++) {
    			map[i][j] = tmap[i- score_line_cnt][j];
    		}
    	}
    }
    
    void remove_score_line(int map[][5]) {
    	score_line_cnt = 0;
    	scored = false;
    
    	for (int i = 0; i <= 5; i++) {
    		int cnt = 0;
    		for (int j = 0; j < 4; j++) {
    			if (map[i][j] == 1) cnt++;
    		}
    		if (cnt == 4) {
    			for (int k = 0; k < 4; k++) {
    				map[i][k] = 0;
    			}
    			score_line = i;
    			score_line_cnt++;
    			scored = true;
    			res++;
    		}
    	}
    }
    
    void Gfirst_move(int map[][5]) {
    	if (t == 1) {
    		int y = 0;
    		int x = sx;
    
    		for (int i = 1; i <= 6; i++) {
    			int ny = y + i;
    
    			if (map[ny][x] == 1) {
    				map[ny-1][x] = 1;
    				break;
    			}
    		}
    	}
    	else if (t == 2) {
    		int y = 0;
    		int x = sx;
    
    		for (int i = 1; i <= 6; i++) {
    			int ny = y + i;
    
    			if (map[ny][x] == 1 || map[ny][x+1] == 1) {
    				map[ny - 1][x] = 1;
    				map[ny - 1][x+1] = 1;
    				break;
    			}
    		}
    	}
    	else {
    		int y = 0;
    		int x = sx;
    
    		for (int i = 2; i <= 6; i++) {
    			int ny = y + i;
    
    			if (map[ny][x] == 1) {
    				map[ny - 1][x] = 1;
    				map[ny - 2][x] = 1;
    				break;
    			}
    		}
    	}
    }
    
    void Bfirst_move(int map[][5]) {
    	if (t == 1) {
    		int y = 0;
    		int x = sy;
    
    		for (int i = 1; i <= 6; i++) {
    			int ny = y + i;
    
    			if (map[ny][x] == 1) {
    				map[ny - 1][x] = 1;
    				break;
    			}
    		}
    	}
    	else if (t == 2) {
    		int y = 0;
    		int x = sy;
    
    		for (int i = 2; i <= 6; i++) {
    			int ny = y + i;
    
    			if (map[ny][x] == 1) {
    				map[ny - 1][x] = 1;
    				map[ny - 2][x] = 1;
    				break;
    			}
    		}
    	}
    	else {
    		int y = 0;
    		int x = sy;
    
    		for (int i = 1; i <= 6; i++) {
    			int ny = y + i;
    
    			if (map[ny][x] == 1 || map[ny][x + 1] == 1) {
    				map[ny - 1][x] = 1;
    				map[ny - 1][x + 1] = 1;
    				break;
    			}
    		}
    	}
    }
    
    void count_blocks() {
    	for (int i = 0; i < 6; i++) {
    		for (int j = 0; j < 4; j++) {
    			if (green[i][j] == 1) res2++;
    		}
    	}
    
    	for (int i = 0; i < 6; i++) {
    		for (int j = 0; j < 4; j++) {
    			if (blue[i][j] == 1) res2++;
    		}
    	}
    }
    
    void set_edge() {
    	for (int i = 0; i < 7; i++) {
    		for (int j = 0; j < 5; j++) {
    			if (i == 6 || j == 4) {
    				green[i][j] = 1;
    				blue[i][j] = 1;
    			}
    		}
    	}
    }
    
    void solve() {
    	set_edge();
    
    	cin >> n;
    	for (int i = 0; i < n; i++) {
    		cin >> t >> sy >> sx;
    
    		Gfirst_move(green);
    		remove_score_line(green);
    		if(scored)	falling_by_score(green);
    		pale_move(green);
    
    
    
    		Bfirst_move(blue);
    		remove_score_line(blue);
    		if (scored)	falling_by_score(blue);
    		pale_move(blue);
    
    
    	}
    	count_blocks();
    	cout << res << '\n';
    	cout << res2 << '\n';
    }
    
    int main() {
    	solve();
    	return 0;
    }

     

     

     

    'PS' 카테고리의 다른 글

    백준 1062번 가르침  (0) 2021.02.01
    백준 4577번 소코반  (0) 2021.01.29
    백준 16929번 Two Dots  (0) 2020.04.14
    백준 dfs 스페셜 저지  (0) 2020.04.10
    백준 16973번 직사각형 탈출  (0) 2020.04.08
Designed by Tistory.