본문 바로가기
Computer Science

4 Problem B : 타일 채우기

by OKOK 2020. 1. 13.

Problem B : 타일 채우기

 

제한시간: 1000 ms    메모리제한: 64 MB
Special Judge

 

 

정사각형 모양의 화장실 바닥을 타일로 채우려고 한다.
화장실의 바닥에는 배수구가 있는데 이곳에는 타일을 놓을 수 없다.
타일의 모양은 다음과 같은 4가지 종류가 있다.

 

 

 

화장실 바닥의 한 변의 길이와 배수구의 위치를 입력으로 받아서 

배수구를 제외한 나머지 부분에 빈 공간 없이 타일을 채우는 프로그램을 작성하시오.



 

첫 번째 줄에는 화장실 바닥의 한 변의 길이 N을 입력받는다. ( 2≤N≤512, N은 2의 거듭제곱 2, 4, 8, 16...) 다음 줄에는 구멍의 위치 X , Y를 입력받는다. X는 위쪽으로부터의 거리, Y는 왼쪽으로부터의 거리를 의미한다. (0≤X,Y<N)

 

 

화장실 바닥의 각 위치에 배치한 타일의 번호를 모두 출력한다. 구멍의 위치에는 0을 출력한다.

 

8

2 3

 

4 4 3 3 4 4 3 3

4 4 4 3 4 3 3 3

2 4 2 0 3 3 3 1

2 2 2 2 1 3 1 1

4 4 2 1 1 1 3 3

4 2 2 2 1 1 1 3

2 2 2 1 2 1 1 1

2 2 1 1 2 2 1 1

 

#include <stdio.h>

#define MAX 10 // 520

int tile[MAX][MAX];
int dy[4] = { 0, 0, 1, 1 }, dx[4] = { 0, 1, 0, 1 };

void fill(int n, int sy, int sx, int hy, int hx) //
{
	if (n < 2) return; // 한칸 씩만 남았으면
	int m = n / 2, my = sy + m, mx = sx + m, y, x; // 반으로 쪼개고, 
	int hp = hy / my * 2 + hx / mx; // 빈 홀을 검사하는 역할?
	for (int i = 0; i < 4; i++) { // 4칸이므로
		if (i == hp) fill(m, sy + m * dy[i], sx + m * dx[i], hy, hx); // 재귀로
		else {
			y = my - 1 + dy[i], x = mx - 1 + dx[i];
			tile[y][x] = hp + 1; // 타일 채우기
			fill(m, sy + m * dy[i], sx + m * dx[i], y, x); // 재귀로
		}
	}
}

int main()
{
	freopen("input.txt", "r", stdin);
	int n, hy, hx;
	scanf("%d %d %d", &n, &hy, &hx);
	fill(n, 0, 0, hy, hx); // 판의 크기, 시작 점과 홀이 있는 지점 넣기
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++) {
			printf("%d ", tile[i][j]);
		}
		printf("\n");
	}
	return 0;
}

'Computer Science' 카테고리의 다른 글

Problem D : 어디 있니?( where are you?)  (0) 2020.01.28
4 Problem C : 숫자 야구2  (0) 2020.01.27
4 Problem A : 책 복사하기  (0) 2020.01.13
Problem D : 쌓기나무  (0) 2020.01.10
못생긴 수  (0) 2020.01.09

댓글