Demo entry 5968283

DDD

   

Submitted by anonymous on Sep 10, 2016 at 20:19
Language: C. Code size: 2.4 kB.

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define N_MAX 1000

int Mirror[N_MAX][N_MAX];	// 거울 위치 배열
int Count[N_MAX][N_MAX];	// 반사 횟수
char lineinput[N_MAX];		// 행 단위 string input
int N;						// 입력된 배열 크기
int x, y;					// 이동 좌표
int dir;					// 반사 방향; {up, left, down, right} == {1, 2, 3, 4}
int sum;					// 반사 횟수 총 합

void InsertData() {
	scanf("%d", &N);

	for (int i = 0; i < N; i++) {
		scanf("%s", lineinput);
		for (int j = 0; j < N; j++) {
			Mirror[i][j] = lineinput[j] - '0';
		}
	}
}

void Search() {
	y = 0;
	x = 0;
	dir = 4;

	while (!(y < 0 || x<0 || y > N - 1 || x > N - 1)) {		// 좌표가 N x N 배열을 벗어나지 않으면,
		CheckMove();										// 계속 check and move
	}
}

void CheckMove() {
	if (Mirror[y][x] == 0) {	// 거울이 없으면,
		switch (dir) {
		case 1:
			y = y - 1;
			break;
		case 2:
			x = x - 1;
			break;
		case 3:
			y = y + 1;
			break;
		case 4:
			x = x + 1;
			break;
		}
	}
	else if (Mirror[y][x] == 1) {	// 왼쪽 하단으로 내려가는 거울
		if (Count[y][x] == 0) {	// 한 번도 반사되지 않은 경우에만,
			Count[y][x] = 1;	// Count[][]에 1을 넣음
		}

		switch (dir) {
		case 1:
			x = x + 1;
			dir = 4;
			break;
		case 2:
			y = y + 1;
			dir = 3;
			break;
		case 3:
			x = x - 1;
			dir = 2;
			break;
		case 4:
			y = y - 1;
			dir = 1;
			break;
		}
	}
	else if (Mirror[y][x] == 2) {	// 오른쪽 하단으로 내려가는 거울
		if (Count[y][x] == 0) {		// 한 번도 반사되지 않은 경우에만,
			Count[y][x] = 1;		// Count[][]에 1을 넣음.
		}

		switch (dir) {
		case 1:
			x = x - 1;
			dir = 2;
			break;
		case 2:
			y = y - 1;
			dir = 1;
			break;
		case 3:
			x = x + 1;
			dir = 4;
			break;
		case 4:
			y = y + 1;
			dir = 3;
			break;
		}
	}
}

// 반사된 거울 횟수 counting.
void Counting() {
	sum = 0;
	for (int i = 0; i < N; i++) {
		for (int j = 0; j < N; j++) {
			sum += Count[i][j];
		}
	}
}

// 배열 초기화
void Init() {
	for (int i = 0; i < N; i++) {
		for (int j = 0; j < N; j++) {
			Mirror[i][j] = 0;
			Count[i][j] = 0;
		}
	}
}

int main(void) {
	setbuf(stdout, NULL);

	int TC;
	int test_case;

	scanf("%d", &TC);
	for (test_case = 1; test_case <= TC; test_case++) {
		InsertData();	// 데이터 입력
		Search();		// 이동하면서, 부딫힌 거울 좌표에 1을 넣음.
		Counting();		// 반사된 거울 갯수 counting.
		Init();			// Mirror[][], Count[][] 배열 0 초기화.

		printf("Case #%d\n", test_case);
		printf("%d\n", sum);
	}

	return 0;
}

This snippet took 0.01 seconds to highlight.

Back to the Entry List or Home.

Delete this entry (admin only).