일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 영통칠프로칠백식당
- 결항
- 검색완료
- 커피쏟음
- 푸르지오포레피스
- 아이혼자다녀옴
- 파이썬
- 편도수술
- 양양솔비치세프스키친
- 사진문자추출하기
- 홍시스무디
- 에어아시아
- 영통외식
- 양양솔비치 뷔페
- 양양솔비치아침
- 중학교입학수학문제
- 주차넉넉
- 종이캐리어
- 영통역소고기
- 당근마켓중고차
- 사진에서 글자추출
- 가족소고기외식
- 사진문자추출
- 커피
- 싱가폴중학교수학문제
- 양양솔비치조식
- 고마워다음
- 오트눈썰매장
- 결항전문
- DFS
- Today
- Total
너와나의 관심사
BFS 보물섬 코드 본문
여기서의 point 는 결국 for loop 두개를 돌리듯이
queue 를 두개 사용해서 L 에 관련해서 for loop 을 두번 돌리는게 핵심 접근 방법
그리고 더 짧은 경로가 있을지 모르니 짧은 경로일 경우 추가하는.. point 를 넣어 주는 게 핵심
if (!dist[ny][nx] || dist[ny][nx] > dist[y][x] + 1){
dist[ny][nx] = dist[y][x] + 1;
q.push(make_pair(nx, ny));
}
#include <stdio.h>
#include <iostream>
#include <vector>
#include <cmath>
#include <string>
#include <set>
#include <queue>
#include <functional>
#include <algorithm>
#include <memory.h>
#pragma warning(disable : 4996)
using namespace std;
long long min_v, max_v;
#define MAX(a,b) a>b ? a:b
#define MIN(a,b) a>b ? b:a
#define MAX_VAL 100001
vector<vector<int> > adj; // 인접리스트
vector<bool> discovered; // 발견 여부 체크
int V, S, E;
int M, N;
vector<bool> discov;
queue < pair <int, int >> q;
int ans = 0;
char map[301][301];
int dist[301][301];
int dy[4] = { 1, -1, 0, 0 };
int dx[4] = { 0, 0, 1, -1 };
int main() {
int TC = 1;
int MAX_SIZE;
freopen("input12.txt", "r", stdin); setbuf(stdout, NULL); //cin >> TC;
cin >> M >> N;
queue<pair<int, int> > land;
for (int i = 0; i < M; i++) {
for (int j = 0; j < N; j++) {
cin >> map[i][j];
if (map[i][j] == 'L'){
land.push(make_pair(j, i));
}
}
}
while (!land.empty()){
memset(dist, 0, sizeof(dist));
int land_x = land.front().first;
int land_y = land.front().second;
dist[land_y][land_x] = 1;
land.pop();
queue<pair<int, int> > q;
q.push(make_pair(land_x, land_y));
while (!q.empty()){
int x = q.front().first;
int y = q.front().second;
q.pop();
for (int k = 0; k < 4; k++){
int nx = x + dx[k];
int ny = y + dy[k];
if (0 > nx || nx >= N || 0 > ny || ny >= M)
continue;
//if (map[ny][nx] == 'W' || (land_x == nx && land_y == ny))
if (map[ny][nx] == 'W')
continue;
if (!dist[ny][nx] || dist[ny][nx] > dist[y][x] + 1){
dist[ny][nx] = dist[y][x] + 1;
q.push(make_pair(nx, ny));
}
}
}
for (int i = 0; i<M; i++)
for (int j = 0; j<N; j++)
if (dist[i][j])
ans = max(ans, dist[i][j]);
}
cout << ans -1 << endl;
return 0;
}
'coding Algorithm' 카테고리의 다른 글
linked list (insert, remove) 코딩 Tip 정리 (0) | 2020.08.11 |
---|---|
퀵소팅 알고리즘 (0) | 2019.01.12 |
최소 편집 알고리즘 (0) | 2018.07.28 |
부분 배열의 합이 0에 가까운 값을 찾는 방법 (0) | 2018.03.13 |
코딩시험 실수담 (1) | 2018.03.11 |