일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 재귀함수
- 브루트포스
- Crossfit
- 회전하는큐
- 서울에서경산까지
- 14863
- sw expert academy
- 4811
- 1781
- 재귀
- BOJ
- 크로스핏
- DP
- 15662
- spring boot
- 동적프로그래밍
- 백준
- 스택
- Flutter
- BOJ14889
- C++
- D1
- dart
- 그리디
- 1로만들기2
- 26008
- 15353
- Python
- 해시해킹
- 삼성
- Today
- Total
곧죽어도 콛잉
[브루트 포스 / BOJ 14497 / C++] 주난의 난(難) 본문
https://www.acmicpc.net/problem/14497
14497번: 주난의 난(難)
주난이는 크게 화가 났다. 책상 서랍 안에 몰래 먹으려고 숨겨둔 초코바가 사라졌기 때문이다. 주난이는 미쳐 날뛰기 시작했다. 사실, 진짜로 뛰기 시작했다. ‘쿵... 쿵...’ 주난이는 점프의 파
www.acmicpc.net
1) 상하좌우로 dfs를 시행한다. (총 4번의 dfs)
(참고로 x,y,x2,y2 input 모두 (1,1) ,,, (M,N)으로 들어오므로 -1 해줘야한다..)
2) 1번의 점프가 끝났으므로, res를 업데이트
3) 만약 dfs에서 #를 찾았다면(chk==1) res를 출력하고 종료.
4) 아직 #을 못찾았다면, 다시 dfs를 수행해야하므로 사용된 vis를 0으로 업데이트 해준다.
이 문제는 간단한 구현문제다!
상하좌우로 dfs나 bfs를 시행하여 마주치는 모든 1를 0으로 바꾼다.
우선 solve 함수를 보자!
1) 상하좌우로 dfs를 시행한다. (총 4번의 dfs)
(참고로 x,y,x2,y2 input 모두 (1,1) ,,, (M,N)으로 들어오므로 -1 해줘야한다..)
2) 1번의 점프가 끝났으므로, res를 업데이트
3) 만약 dfs에서 #를 찾았다면(chk==1) res를 출력하고 종료.
4) 아직 #을 못찾았다면, 다시 dfs를 수행해야하므로 사용된 vis를 0으로 업데이트 해준다.
이제 dfs는 우리가 알던 그 dfs로 시전해준다.
다만, 조건을 추가한다. 바로 dfs가 #을 찾으면(x2-1,y2-1) 찾았다고 표시를 해준다.
또한, 만나는 '1' 마다 '0'으로 바꿔준다!
그리고 보통은 반복문 안에 dfs() 함수를 돌릴때는 vis를 초기화시키고 dfs를 돌리는데, 이거는 그럴 필요 없다.
왜냐하면 어차피 상하좌우 모두 탐색할 예정이니, 괜히 vis를 초기화시키면 갔던 장소를 또가게 되고, 한번의 점프 시도로 모든 1들이 0으로 바뀌어 무한 루프에 빠질수도 있다.
이런 부분을 주의해서 구현해주면 풀린다!
#include <bits/stdc++.h>
using namespace std;
int N, M, x, y, x2, y2, res, chk;
char bd[304][304];
int vis[304][304];
int dy[4] = {0, 1, 0, -1};
int dx[4] = {1, 0, -1, 0};
void dfs(int n1, int n2){
if(n1 >= N || n2 >= M || n1 < 0 || n2 < 0 ) return; // n1, n2가 조건에 안맞으면 종료.
if(vis[n1][n2]) return;
if(n1==(x2-1) && n2==(y2-1)) {chk=1; return;}
if(bd[n1][n2]=='1'){ // 만약 현위치가 (n1,n2) 면은 함수를 종료하고
bd[n1][n2] = '0';
vis[n1][n2]=1; // 현위치 방문표시
return;
}
vis[n1][n2] = 1; // 방문표시
for(int i = 0; i < 4 ; i++){
int ny = n1 + dy[i];
int nx = n2 + dx[i];
dfs(ny,nx);
}
return;
}
void solve(){
while(true){
for(int i = 0 ; i < 4 ; i++){
dfs(x-1 + dy[i], y-1 + dx[i]);
} // dfs 상하좌우 1번씩.
res++; // 1번 점프 끝남.
if(chk) {cout << res; return;}
memset(vis, 0, sizeof(vis)); // vis 초기화
}
return;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);
cin >> N >> M >> x >> y >> x2 >> y2;
for(int i = 0 ; i < N ; i++){
string s;
cin >> s;
for(int j = 0 ; j < M ; j++){
bd[i][j] = s[j];
}
}
solve();
}
'Coding Test > C++' 카테고리의 다른 글
[브루트 포스 / BOJ 14620 / C++] 꽃길 (0) | 2023.03.21 |
---|---|
[브루트 포스 / BOJ 2529 / C++] 부등호 (0) | 2023.03.19 |
[브루트 포스 / BOJ 2589 / C++] 보물섬 (0) | 2023.03.15 |
[브루트 포스 / BOJ 15686 / C++] 치킨 배달 (0) | 2023.03.12 |
[그래프 / BOJ 17825 / C++] 주사위 윷놀이 (0) | 2023.03.12 |