Notice
Recent Posts
Recent Comments
Link
DY N DY
문제은행(BFS) 장기(JAVA) 본문
1106 : 장기
제한시간: 1Sec 메모리제한: 64mb
해결횟수: 834회 시도횟수: 2799회
N×M장기판에 졸 한개와 말 한개가 놓여 있다. 말의 이동 방향이 다음과 같다고 할 때, 말이 최소의 이동횟수로 졸을 잡으려고 한다.
말이 졸을 잡기 위한 최소 이동 횟수를 구하는 프로그램을 작성해보자.
[Copy]9 9 3 5 2 8 | [Copy]2 |
- /**************************************************************
- Problem: 1106
- User: a132034
- Language: Java
- Result: Success
- Time:146 ms
- Memory:9004 kb
- ****************************************************************/
- import java.util.LinkedList;
- import java.util.Queue;
- import java.util.Scanner;
- public class Main {
- /*
- * 입력 - N M (장기판)
- * R C S K (말, 졸의 위치)
- * */
- @SuppressWarnings("resource")
- int N, M, R, C, S, K;
- Queue<Point> queue = new LinkedList<Point>();
- Point mal, zol;
- int[] x = {2,2,-2,-2,1,1,-1,-1};
- int[] y = {-1,1,-1,1,-2,2,-2,2};
- N = sc.nextInt();
- M = sc.nextInt();
- R = sc.nextInt();
- C = sc.nextInt();
- S = sc.nextInt();
- K = sc.nextInt();
- int[][] map = new int[N][M];
- for(int i = 0 ; i < N; ++i)
- {
- for(int j = 0; j < M; ++j)
- {
- map[i][j] = -1;
- }
- }
- map[mal.x][mal.y] = 0; //말의 위치
- map[zol.x][zol.y] = -2; //졸의 위치
- queue.add(mal);
- while(!queue.isEmpty())
- {
- Point st, end;
- //시작점이 됨.
- //8방향
- for(int i = 0 ; i < 8; ++i)
- {
- int xMap = st.x + x[i];
- int yMap = st.y + y[i];
- if(xMap < 0 || xMap >= N || yMap < 0 || yMap >= M) //바운더리 처리
- continue;
- //한번 방문한 곳은 한번만
- if(map[xMap][yMap] != 0 && map[xMap][yMap] != -1 && map[xMap][yMap] != -2)
- {
- continue;
- }
- if(map[xMap][yMap] == -1) //이 지점을 방문한 적이 없다면
- {
- map[xMap][yMap] = map[st.x][st.y] + 1;//이전 인덱스 + 1
- }
- else if(map[xMap][yMap] == -2) //이 지점이 목표 지점이라면
- {
- map[xMap][yMap] = map[st.x][st.y] + 1;//이전 인덱스 + 1
- return;
- }
- // else //지나갔던 지점이라면
- // {
- // if(map[xMap][yMap] > map[st.x][st.y] + 1) //더 빠른 경로로 올 수 있다면.
- // map[xMap][yMap] = map[st.x][st.y] + 1;
- // }
- queue.add(end);
- }
- }
- }
- {
- public int getX() {
- return x;
- }
- public void setX(int x) {
- this.x = x;
- }
- public int getY() {
- return y;
- }
- public void setY(int y) {
- this.y = y;
- }
- public int x;
- public int y;
- super();
- this.x = x;
- this.y = y;
- }
- }
- }
말의 위치로부터 8방향으로 갈 수 있음.Point 클래스는 좌표를 입력받기 위한 클래스
졸의 위치를 가기 위해 모든 방향으로 탐색을 해봐야 가장 적은 이동 횟수만으로 졸의 위치에 갈 수 있는 횟수를 알 수 있음.
BFS(넓이 우선 탐색)를 이용해서 전체 탐색
x, y배열을 각 8방향의 이동을 위하여 만든 것.
기본적으로 BFS는 queue를 이용해서 탐색.
첫 번째 위치(말의 위치) 에서 갈 수 있는 모든 좌표를 큐에 넣어주고
큐에서 하나씩 꺼내어 다시 갈 수 있는
위치를 넣어 줌.(count를 1씩 증가)
만약 지나간 위치를 다시 간다면 가장 적은 이동 횟수가 안되므로 제외. (주석은 무시..)
목표지점에 도착하면 그때의 count를 반환하며 종료.
'PARK > ALGORITHM' 카테고리의 다른 글
실력키우기 팩토리얼(C++) (0) | 2016.04.02 |
---|---|
실력키우기 10진수를 2진수로(JAVA) (1) | 2016.04.01 |
실력키우기 별삼각형2(JAVA) (0) | 2016.03.31 |
실력키우기 별삼각형1(JAVA) (0) | 2016.03.30 |
실력키우기 구구단2 (JAVA) (0) | 2016.03.29 |