3*3 테트리스를 쌓는 프로그램 작성 하시오
예외 처리, 3*3을 1*3으로 만들어서 풀이
#include <stdio.h>
//#define tet_MAX 30010
#define tet_MAX 31
int N, M, H, P, tet[tet_MAX], gogo[3]; // 테트의 위치를 비트로 표현함
void rotate(int b[3][3])
{
int a[3][3], i, j;
for (i = 0; i < 3; i++) for (j = 0; j < 3; j++) { // 회전 시키고
a[i][j] = b[j][2 - i];
}
for (i = 0; i < 3; i++) for (j = 0; j < 3; j++) { // 그것을 입력함
b[i][j] = a[i][j];
}
}
void input()
{
int block[3][3], R, S, i, j; // 들어온 블럭, 회전, 이동
for (i = 2; i >= 0; i--) for (j = 0; j < 3; j++) scanf("%d", &block[i][j]); // 왜 i를 2부터 받지?
scanf("%d %d", &R, &S); // 회전수와 이동수
R %= 4; // 4회전 하면 동일하므로
if (S > N) S = N; // 이동 수가 행보다 크면 S = N 으로 입력
while (R--) rotate(block); // 회전 함 블럭을
//3x3을 3x1로 압축함
for (i = 0; i < 3; i++) gogo[i] = (block[i][2] << 2) + (block[i][1] << 1) + block[i][0]; // 테트 비트 표현
// 왼쪽이 비었으면 왼쪽으로 이동함
while ((gogo[0] & 1) + (gogo[1] & 1) + (gogo[2] & 1) == 0) for (i = 0; i < 3; i++) gogo[i] >>= 1;
// 제일 아래칸이 비었으면 아래로 이동 시킴
while (gogo[0] == 0) gogo[0] = gogo[1], gogo[1] = gogo[2], gogo[2] = 0;
// S만큼 이동시킴
for (i = 0; i < 3; i++) gogo[i] <<= S;
// 오른쪽으로 넘어갔으면 안쪽으로 한칸 당김
while (gogo[0] > P || gogo[1] > P || gogo[2] > P) for (i = 0; i < 3; i++) gogo[i] >>= 1;
}
void drop()
{
int i, j, k;
// 기존의 테트리스와 겹치게 되면
for (i = H; i > 0; i--) {
if ((tet[i] & gogo[0]) + (tet[i + 1] & gogo[1]) + (tet[i + 2] & gogo[2]))
break;
}
// 가장 높은 곳의 위치를 찾기
for (++i, j = 0; j < 3; i++, j++) {
tet[i] += gogo[j];
if (tet[i] && i > H) H = i; // 가장 높은 곳의 위치
}
// 새로넣은 3행에 대해 가득 찬 행이 있으면 삭제하는 작업
for (j = i - 1; j >= i - 3; j--) { // 위에서부터 검사해서
if (tet[j] == P) { // 그 행이 모두 찼으면
for (k = j; k <= H; k++) tet[k] = tet[k + 1]; // 그 위에 행들이 하나씩 내려옴
H--;
}
}
}
int main()
{
scanf("%d %d", &N, &M); // 행, 들어오는 블럭 숫자
P = (1 << N) - 1; // 행이 가득 찼을 때 체크하는 변수
while (M--) { // 블록을 넣고, 쌓기
input();
drop();
}
printf("%d\n", H);
return 0;
}
'Algorithms > simulation' 카테고리의 다른 글
4 Problem B : 타일 채우기 (0) | 2019.11.07 |
---|---|
4 Problem A : 책 복사하기 (0) | 2019.11.07 |
2 Problem F : 합이 0이 되는 4개의 숫자들 (0) | 2019.11.06 |
3 Problem A : 비밀편지 (0) | 2019.11.06 |
Problem E : 기수정렬(Radix Sort) (0) | 2019.11.05 |
댓글