BOJ::1697 숨바꼭질
https://www.acmicpc.net/problem/1697
너비우선 탐색을 이용하여 제일 먼저 도착한 시간을 출력해주면 된다.
중요한 점은 visited배열을 이용해서 같은장소에 여러번 가지 않게 하는것이다.
JAVA
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 | import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.LinkedList; import java.util.Queue; import java.util.StringTokenizer; class Main{ static boolean visited[] = new boolean [100001]; static int n,k; static int dx[]={1,-1,2}; public static void main(String args[]) throws IOException{ BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st = new StringTokenizer(br.readLine()); n=Integer.parseInt(st.nextToken()); k=Integer.parseInt(st.nextToken()); bfs(n); } public static void bfs(int v){ Queue<Node> q = new LinkedList(); q.add(new Node(v,0)); visited[n]=true; while(!q.isEmpty()){ int pos = q.peek().pos; int time = q.poll().time; int next; if(pos==k){ System.out.println(time); return ; } for(int i = 0 ; i <3 ; i++){ if(i==2){ next= pos*2; }else{ next = pos+dx[i]; } if(next>=0&&next<=100000){ if(!visited[next]){ q.add(new Node(next,time+1)); visited[next]=true; } } } } } } class Node{ int pos; int time; Node(int p, int t){ pos=p; time =t; } } | cs |
C++
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 | #include <iostream> #include <queue> using namespace std; int n, k; bool visited[1000001]; class Node { public : int pos; int time; Node(int p, int t) { pos = p; time = t; } }; void bfs(int v) { queue<Node> q; q.push(Node(v, 0)); visited[v] = true; int dx[] = { 1,-1 }; int next; while (!q.empty()) { int pos = q.front().pos; int time = q.front().time; q.pop(); if (pos == k) { cout << time << endl; return; } for (int i = 0; i < 3; i++) { if (i == 2) { next = pos * 2; } else { next = pos + dx[i]; } if ((next >= 0 && next <= 100000) && !visited[next]) { q.push(Node(next, time + 1)); visited[next] = true; } } } } int main() { cin >> n >> k; bfs(n); } | cs |
'BOJ::문제풀이' 카테고리의 다른 글
1874 스택 수열 (0) | 2017.12.31 |
---|---|
1759 암호 만들기 (0) | 2017.12.31 |
1475 방 번호 (0) | 2017.12.31 |
1463 1로만들기 (0) | 2017.12.31 |
1389 케빈 베이컨의 6단계 법칙 (0) | 2017.12.31 |