[풀이]백준 풀이(II/16924, 16928, 16948, 16954)
이거 사용가능?
문제풀이
십자가 찾기(16924, 브루트포스)
중요한 조건
사용하는 십자가의 수 <=N,M <= 100 큰 십자가는 작은 십자가를 포함한다. 모든 별이 중심이라고 생각하고 가장 큰 십자가를 찾으면 된다! O(NM*(N+M)) = O(N^3)
회고
우선 패스,,
[필수]뱀과 사다리게임(16928, BFS)
- 사실상 아래의 BFS랑 같은 소스이므로 구현해보자.
void bfs(int 시작){ queue<int> q; q.push(시작); check[시작] = true; dist[시작] = 0; while(!q.empty()){ int x = q.front(); q.pop(); for(가능한 모든 다음 정점 y){ if(check[y] == false) { q.push(y); check[y] = true; dist[y]=dist[x]+1; } } } } - 1 TO 100 이동하는 게임
- 사다리 = +, 뱀 = -
- 주사위 값을 정할 수 있을 때 100까지 갈 수 있는 최단거리(최소)
- 칸 = vertex, 칸 TO 칸 = edge
- 구하는 것 = 주사위를 굴리는 최소 횟수 (가중치=1)
최소: 최소라는 키워드가 나오면 BFS를 일단 생각해본다.
- X의 다음 경우의 수 (X+ 1~6, 사다리, 뱀)
- 새로운 배열
next[x]를 만들어서, x에 도착한 이후에 가야할 곳을 모두 기록
회고
짜고보니 답이 이상해서 한참 고생했다.. //요기 부분이 누락되어서 그랬던 것. 처음에는 check배열까지 만들었다가 강의를 듣고나서 고쳤다. 아직 자꾸 재귀처럼 생각하게되는데 종이에 써가면서 안풀면 조금 어렵다..
#include <iostream>
#include <queue>
using namespace std;
int dist[101];
int next_num[101];
void bfs(int start){
queue<int> q;
q.push(start);
dist[start]=0;
while(!q.empty()){
int x= q.front();
q.pop();
for(int i=1; i<=6; i++){
int y= x+i;
if(y>100) continue;
//요기.
y= next_num[y];
if(dist[y] == -1){
dist[y]= dist[x]+1;
q.push(y);
}
}
}
}
int main(){
int n, m, x, y, u, v;
for (int i=1; i<=100; i++) {
//dist[i] == -1인 경우 check되지 않음을 뜻함
next_num[i] = i;
dist[i] = -1;
}
cin >> n >> m;
for(int i=0; i<n; i++){
cin >> x >> y;
next_num[x]=y;
}
for(int i=0; i<m; i++){
cin >> u >> v;
next_num[u]=v;
}
bfs(1);
cout << dist[100];
}
데스나이트(16948, BFS)
- 이동할 경우 이동횟수가 1개 늘어난다 = 가중치가 1이다. (BFS)
d[x]={-2,-2,0,0,2,2}d[y]={-1,+1,-2,+2,-1,+1}
모델링을 직접 해보자
회고
실수1. dist배열의 초기화 실수 (-1로 꽉안채웠다.. memset을 사용하자)
실수2. dx, dy루프의 k값을 4로했다 ㅎ;;
실수3. bfs안에서 dist 값을 변경하는 조건문이 부족하거나 오타가 있었다.
어쩃든 clear!
#include <iostream>
#include <queue>
#include <cstring>
using namespace std;
//여기서 초기화가 안되었네.
//int dist[201][201] = {-1,};
int dist[201][201];
int n, rs, cs, re, ce;
int dx[] = {-2, -2, 0, 0 ,2, 2};
int dy[] = {-1, 1, -2, 2, -1, 1};
void bfs(int rs, int cs){
queue<pair <int, int>> q;
q.push(make_pair(rs,cs));
dist[rs][cs] = 0;
while(!q.empty()){
pair<int, int> x = q.front();
q.pop();
//k=4로 했었다..
for(int k=0; k<6; k++){
pair<int, int> y = make_pair(x.first + dx[k], x.second +dy[k]);
//조건문이 조금 부족했다.
//if(y.first == re && y.second == ce) continue;
if(0<= y.first)
{
if(y.first < n)
{
//오타가 있었다.
if(0 <= y.second)
{
if(y.second <n)
{
if(dist[y.first][y.second]==-1)
{
q.push(y);
dist[y.first][y.second] = dist[x.first][x.second] +1;
}
}
}
}
}
}
}
}
int main(){
cin >> n;
cin >> rs >> cs >> re >> ce;
memset(dist,-1,sizeof(dist));
bfs(rs,cs);
cout << dist[re][ce];
}
댓글남기기