본문 바로가기

삼성전자 알고리즘/정올

4. 1661 : 미로 탈출 로봇

문제 원본 : http://jungol.co.kr/bbs/board.php?bo_table=pbank&wr_id=934&sca=50&sfl=wr_hit&stx=1661&sop=and

 

JUNGOL | 미로 탈출 로봇 > 문제은행

제한시간: 1000 ms    메모리제한: 64 MB 해결횟수: 590 회    시도횟수: 2465 회    정올에서 미로탈출 로봇 대회를 개최하였다. 대회에 사용되는 미로는 가로(X), 세로(Y) 100이하의 크기이며, 미로를 한 칸 이동하는 데는 1초가 걸린다. 대회에 참가중인 민성이는 자신의 로봇이 가장 빨리 미로를 탈출하기 위해 미로의 모양을 입력받아서 도착점까지 가장 빠른 길을 찾으려고 한다. 프로그램을 작성하여 민성이를 도와주자.

jungol.co.kr

문제 풀이 : 

#include<stdio.h>
#define MAX (101)
int map[MAX][MAX]; //지도
int visit[MAX][MAX]; // 방문체크
// 큐 구조체 설계
typedef struct _node {
	int r, c, time;
}NODE;
NODE que[MAX * MAX]; //큐배열 생성 -> Full 상태 없게 하기 위해 충분히 크게!
int rp, wp;
int R, C, sr, sc, er, ec;
void In_Que(int r, int c, int time) {
	que[wp].r = r;
	que[wp].c = c;
	que[wp].time = time;
	wp++;
}
void Out_Que(NODE* p) {
	*p = que[rp++];
}
int BFS(void) {
	int dr[4] = { -1,1,0,0 }, dc[4] = { 0,0,-1,1 }; //상하좌우
	int i, nr, nc;
	NODE q;
	In_Que(sr, sc, 0);
	visit[sr][sc] = 1; // 방문체크
	while (rp < wp) { // 큐 empty check
		//q = que[rp++];
		Out_Que(&q); // 현재 좌표
		if (q.r == er && q.c == ec) return q.time;
		for (i = 0; i < 4; i++) {
			nr = q.r + dr[i];
			nc = q.c + dc[i];
			if (nr<1 || nr>R || nc<1 || nc>C) continue; // 범위 벗어나면 스킵
			if (visit[nr][nc] == 1) continue;
			if (map[nr][nc] == 0) { //연결점 찾기(길)
				In_Que(nr, nc, q.time + 1);
				visit[nr][nc] = 1;
			}
		}
	}
	return -1; //큐가 빈상태(예외체크 - 미로탈출의 경우 예외경우 없음)
}
void input(void) {
	int i, j;
	scanf("%d %d", &C, &R);
	scanf("%d %d %d %d", &sc, &sr, &ec, &er);
	for (i = 1; i <= R; i++) {
		for (j = 1; j <= C; j++) {
			scanf("%1d", &map[i][j]);
		}
	}
}
int main(void) {
	int sol;
	input();
	sol = BFS();
	printf("%d\n", sol);
	return 0;
}

 

'삼성전자 알고리즘 > 정올' 카테고리의 다른 글

7. 1169 : 주사위 던지기1[DFS]  (0) 2019.06.16
5. 1078 : 저글링 방사능 오염  (0) 2019.06.16
3. 1240 : 제곱근  (0) 2019.05.13
2. 1161 : 하노이탑1  (0) 2019.05.09
1. 1102 스택 (stack)  (0) 2019.05.09