[URL]
SW Expert Academy
SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!
www.swexpertacademy.com
[풀이 과정]
* BFS
유사문제: 단지번호붙이기, 최단경로
경로중 최소값을 넣어줘야하는 로직 !!
1. input & init
2. BFS()
[소스 코드]
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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 | #include <stdio.h> #include <string.h> #include <queue> #define MAX 101 using namespace std; int map[MAX][MAX]; int N; bool check[MAX][MAX]; int dist[MAX][MAX]; int dx[] = { 0, 0, -1, 1 }; int dy[] = { -1, 1, 0, 0 }; int BFS() { queue <pair <int, int>> q; check[0][0] = true; dist[0][0] = 0; q.push(make_pair(0, 0)); // 시작점 while (!q.empty()) { int cx = q.front().first; int cy = q.front().second; q.pop(); for (int k = 0; k < 4; k++) { int nx = cx + dx[k]; int ny = cy + dy[k]; if (nx >= 0 && nx < N && ny >= 0 && ny < N) // map범위 안인가? { // 방문한 적 없는가? || (최소값 계산!) 기존값 dist[nx][ny] 보다 작은 값 계산되면 넣어준다. if (check[nx][ny] == false || dist[nx][ny] > dist[cx][cy] + map[nx][ny]) { check[nx][ny] = true; dist[nx][ny] = dist[cx][cy] + map[nx][ny]; q.push(make_pair(nx, ny)); } } } } return dist[N - 1][N - 1]; // 도착점 return } void init() { for (int i = 0; i < MAX; i++) { memset(map[i], 0, sizeof(int) * MAX); memset(check[i], 0, sizeof(bool) * MAX); memset(dist[i], 0, sizeof(int) * MAX); } scanf("%d", &N); for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { scanf("%1d", &map[i][j]); } } } int main() { int T; scanf("%d", &T); for (int tc = 0; tc < T; tc++) { init(); printf("#%d %d\n", tc + 1, BFS()); } return 0; } | cs |
'Algorithm > SWEA' 카테고리의 다른 글
5644. [모의 SW 역량테스트] 무선 충전 (0) | 2019.07.30 |
---|---|
5658. [모의 SW 역량테스트] 보물상자 비밀번호 (0) | 2019.07.11 |
[SWEA] - 1208. [S/W 문제해결 기본] 1일차 - Flatten (0) | 2019.07.05 |
[SWEA] - 1240. [S/W 문제해결 응용] 1일차 - 단순 2진 암호코드 (0) | 2019.07.01 |
[SWEA] - 1244. [S/W 문제해결 응용] 2일차 - 최대 상금 (0) | 2019.06.22 |