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 |
Tags
- 조세퍼스 순열
- 버킷 정렬
- Stack 이란
- 백준 5397
- 해시구현
- 시간 복잡도
- 백준 2447
- 스택의 특징
- qorwns
- heap
- ㅣ풀이
- 백준 1158
- c#
- 원판 돌리기
- 해시 구현
- 풀이
- AVL 시간 복잡도
- 백준 1406
- 구현
- 5397
- 백준 17471
- dfs
- 별 찍기 10
- 게리멘더링2
- 백준 17822
- 백준
- 자료구조
- 1764
- 백준 17779
- C/C++ 구현
Archives
- Today
- Total
홍시홍의 프로그래밍
[백준 1194] 달이 차오른다, 가자 본문
https://www.acmicpc.net/problem/1194
요구사항
그래프에서 목적지까지 최소 이동 거리 구하기 bfs
풀이
기본적인 bfs + 비트마스크 문제이다.
key를 가지고 있는가 없는가를 비트 마스크를 이용하여 처리한다.
visit[r]][c]에 비트마스크 배열을 추가해준다
visit[r][c][bitmask]
#include <iostream>
#include <queue>
using namespace std;
struct go {
int x;
int y;
int key;
int cnt;
};
int n, m;
char map[51][51];
int visit[51][51][1 << 6];
int sr, sc;
int dc[4] = { 0,-1,0,1 };
int dr[4] = { -1,0,1,0 };
int main()
{
cin >> n >> m;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
scanf(" %c", &map[i][j]);
if (map[i][j] == '0') {
sr = i;
sc = j;
}
}
}
queue<go> q;
q.push({ sr,sc,0 ,0});
int flag = 0;
int ans = 0;
while (!q.empty()) {
int r = q.front().x;
int c = q.front().y;
int key = q.front().key;
int cnt = q.front().cnt;
// cout << r << " " << c << endl;
if (map[r][c] == '1') {
//cout << "AA" << endl;
//cout << cnt << endl;
flag = 1;
ans = cnt;
break;
}
q.pop();
for (int i = 0; i < 4; i++)
{
int nr = r + dr[i];
int nc = c + dc[i];
if (nr < 0 || nc < 0 || nr >= n || nc >= m) {
continue;
}
if (map[nr][nc] == '#')
continue;
if (visit[nr][nc][key] == 1)
continue;
if (map[nr][nc] == 'A' || map[nr][nc] == 'B' || map[nr][nc] == 'C' || map[nr][nc] == 'D' || map[nr][nc] == 'E' || map[nr][nc] == 'F')
{
//cout << "ASDF" << endl;
int nowNum = (int)map[nr][nc] - 'A';
bool nkey = (key & (1<<nowNum));
//cout << "nkey"<<nkey << endl;
if (nkey == 1) {
visit[nr][nc][key] = 1;
q.push({ nr,nc,key,cnt+1 });
}
}
if (map[nr][nc] == 'a' || map[nr][nc] == 'b' || map[nr][nc] == 'c' || map[nr][nc] == 'd' || map[nr][nc] == 'e' || map[nr][nc] == 'f') {
//cout << "A" << endl;
int nowNum = (int)map[nr][nc] - 'a';
int nkey = (key | (1 << nowNum));
//visit[nr][nc][key] = 1;
visit[nr][nc][nkey] = 1;
q.push({ nr,nc,nkey,cnt + 1 });
}
if (map[nr][nc] == '0' || map[nr][nc] == '.' || map[nr][nc]=='1')
{
visit[nr][nc][key] = 1;
q.push({ nr,nc,key,cnt + 1 });
}
}
}
if (flag == 1)
cout << ans << endl;
else {
cout << "-1" << endl;
}
}
'알고리즘 문제풀이 > 백준' 카테고리의 다른 글
[백준 1260] dfs와 bfs (0) | 2020.01.11 |
---|---|
[백준 1944] 복제 로봇 (0) | 2020.01.11 |
[백준 1916] 최소비용 구하기 (0) | 2020.01.09 |
[백준 1753]최단 경로 (0) | 2020.01.09 |
[백준 10825] 국영수 (0) | 2020.01.09 |
Comments