문제
테트리스는 C열 필드위에서 플레이하는 유명한 게임이다. 필드의 행의 수는 무한하다. 한 번 움직일 때, 아래와 같은 일곱가지 블록 중 하나를 필드에 떨어뜨릴 수 있다.
블록을 떨어뜨리기 전에, 플레이어는 블록을 90, 180, 270도 회전시키거나 좌우로 움직일 수 있다. 이때, 블록이 필드를 벗어나지 않으면 된다. 블록을 필드의 바닥이나 이미 채워져있는 칸의 위에 놓여지게 된다.
창영이가 하고있는 테트리스는 일반적인 테트리스와 약간 규칙이 다르다. 블록이 떨어졌을 때, 블록과 블록 또는 블록과 바닥 사이에 채워져있지 않은 칸이 생기면 안 된다.
예를 들어, 아래와 같이 각 칸의 높이가 2, 1, 1, 1, 0, 1인 경우를 생각해보자. 블록 5번을 떨어뜨리는 방법의 수는 아래와 같이 다섯가지이다.
테트리스 필드의 각 칸의 높이와 떨어뜨려야 하는 블록의 번호가 주어진다. 이때, 블록을 놓는 서로 다른 방법의 수를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 C와 떨어뜨리는 블록의 번호 P가 주어진다. (1 ≤ C ≤ 100, 1 ≤ P ≤ 7)
둘째 줄에는 각 칸의 높이가 주어진다. 높이는 0보다 크거나 같고, 100보다 작거나 같은 자연수이다.
풀이
3019 | 맞았습니다!! | 1988 | 0 | C++14 / 수정 | 2046 | 2분 전 |
1. 시뮬레이션
2. 문제를 창의적으로 접근하고, 많은 시뮬레이션 문제를 풀어본 사람이 잘 풀 수 있는 문제 ( != 나 )
3. 쌓여져 있는 블록과 빈 공간이 없도록 쌓기 위해서는 주어진 블록들의 특성을 먼저 파악해야 한다.
- 5번 블록으로 이해하는 것이 가장 쉽다.
왼쪽 위 그림의 밑바닥 높이를 살펴보면 쌓인 블록의 높이는 0 -> 1 이다.
그리고 쌓여져있던 블록의 높이는 2 -> 1이다.
변화량 : 1 - 0 = 1 / 1 - 2 = -1 (차이는 2 -> 그림을 보면 2 높이만큼의 빈 공간이 있다)
오른쪽 위 그림을 보면 쌓인 블록의 높이는 1 -> 0 이고 쌓여져있던 블록의 높이는 2 -> 1이다.
변화량 : 0 - 1 = -1 / 2 - 1 = 1 (차이는 0)
왼쪽 아래 그림을 보면 쌓인 블록의 높이는 1 -> 0 / 0 > 1 이다.
쌓여져 있던 블록의 높이는 2 -> 1 / 1 -> 1 이다.
각각 변화량을 살펴보면 0 - 1 = -1 / 1 - 2 = -1 (차이는 0)
1- 0 = 1 / 1- 1 = 0 (차이는 1)
==> 1만큼의 빈 공간이 존재한다.
4. 이 그림과 각 블록이 밑바닥과 닿는 높이를 이해하고 코드를 보면 된다.
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
|
#include <iostream>
#include <vector>
using namespace std;
int c,p, map[101];
int fileBlocks(string block){
int len = (int) block.size();
vector<int> height;
for (int i = 0; i < len; i++) {
height.push_back(block[i] - '0'); //높이를 저장
}
int cnt = 0;
for (int i = 0; i <= c-len; i++) {
//0~c까지 비교
bool flag = true;
for (int j = 1; j < len; j++) {
//블록 밑바닥 높이의 변화량과 쌓여진 블록의 높이 변화량의 차이를 측정
if (height[j] - height[j-1] != map[i+j] - map[i+j-1]) {
flag = false;
break;
}
}
if (flag) cnt++;
}
return cnt;
}
int playGame() {
//블록마다 밑바닥에 닿는 높이에 지정한다.
//1번 블록이라면 세로방향일 때 밑바닥 높이는 0 / 가로방향일 때 밑바닥 높이 0000
int ans = 0;
if (p == 1) {
ans += fileBlocks("0");
ans += fileBlocks("0000");
} else if (p == 2) {
ans += fileBlocks("00");
} else if (p == 3) {
ans += fileBlocks("001");
ans += fileBlocks("10");
} else if (p == 4) {
ans += fileBlocks("100");
ans += fileBlocks("01");
} else if (p == 5) {
ans += fileBlocks("000");
ans += fileBlocks("01");
ans += fileBlocks("101");
ans += fileBlocks("10");
} else if (p == 6) {
ans += fileBlocks("000");
ans += fileBlocks("00");
ans += fileBlocks("011");
ans += fileBlocks("20");
} else if (p == 7) {
ans += fileBlocks("000");
ans += fileBlocks("02");
ans += fileBlocks("110");
ans += fileBlocks("00");
}
return ans;
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(0);
cin >> c >> p;
for (int i = 0; i < c; i++) {
cin >> map[i];
}
//input
cout << playGame() << '\n';
return 0;
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
|
'BOJ > C++' 카테고리의 다른 글
[BOJ] 양 (0) | 2019.10.25 |
---|---|
[BOJ] 탈출 (0) | 2019.10.25 |
[BOJ] 자와 각도기 (0) | 2019.10.24 |
[BOJ] 안전영역 (0) | 2019.10.24 |
[BOJ] 한윤정이 이탈리아에 가서 아이스크림을 사먹는데 (0) | 2019.10.24 |