Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- stream
- C programming
- Algorithm
- Serialization
- 윤성우 열혈자료구조
- buffer
- R
- datastructure
- 윤성우의 열혈 자료구조
- 이스케이프 문자
- Selection Sorting
- 혼자 공부하는 C언어
- JSON
- Graph
- Stack
- C 언어 코딩 도장
- s
- list 컬렉션
- 알기쉬운 알고리즘
- coding test
- 이것이 자바다
- 메모리구조
- insertion sort
Archives
- Today
- Total
Engineering Note
65. 미로탐색(DFS) 본문
it 취업을 위한 알고리즘 문제풀이
문제
코드
#include <stdio.h>
int map[7][7], visited[7][7];
int dx[] = { 1,0,-1,0 };
int dy[] = { 0,1,0,-1 };
int cnt;
void go(int y, int x) {
if (y == 6 && x == 6) {
++cnt;
}
else {
for (int i = 0; i < 4; ++i) {
// xx, yy는 다음에 갈 곳, x,y는 현재 위치
int xx = x + dx[i];
int yy = y + dy[i];
if (xx >= 0 && xx < 7 && yy >= 0 && yy < 7 && map[yy][xx] == 0 && visited[yy][xx] == 0) {
visited[yy][xx] = 1;
go(yy, xx);
//직전에 방문 한곳 다시 미방문 처리
visited[yy][xx] = 0;
}
}
}
}
int main() {
freopen("input.txt", "rt", stdin);
for (int i = 0; i < 7; ++i) {
for (int j = 0; j < 7; ++j) {
scanf("%d", &map[i][j]);
}
}
visited[0][0] = 1;
go(0, 0);
printf("%d", cnt);
return 0;
}
문제해결방법
- DFS 알고리즘으로 완전탐색 수행했다.
- for 문으로 i값 마다 dx[], dy[]를 통해 상하좌우 방향을 설정하고 현재 위치 x,y에서 dx[],dy[]의 값을 더해주어 문제의 조건에서 벗어나지 않는 위치 인지 확인하고(배열의 범위에서 벗어나지 않고, 벽이 아닌곳) 방쿤체크를 한후 다음 뎁스로 진행한다.
- 마지막 뎁스 까지 진행 하면 카운트 값을 증가시켜준다.
- 다시 함수를 호출한 원래 위치로 돌아오면 방금 전 방문한 곳은 미방문처리로 바꿔주어 다시 다른방향을 통해 갈 수 있도록 해준다.
'Problem Solving > Olympiad in Informatics' 카테고리의 다른 글
66. 경로 탐색(DFS : 인접리스트 방법) (0) | 2021.05.19 |
---|---|
70. 그래프 최단거리(BFS) (0) | 2021.05.19 |
64. 경로 탐색(DFS) (0) | 2021.04.28 |
61. 특정 수 만들기(DFS : MS 인터뷰) (0) | 2021.04.22 |
60. 합이 같은 부분집합(DFS : 아마존 인터뷰) (0) | 2021.04.15 |
Comments