코딍코딍
코딩기록
코딍코딍
전체 방문자
오늘
어제
  • 분류 전체보기 (271)
    • 개발 (2)
    • Java (1)
    • 스프링 (28)
    • JPA (11)
    • Git (3)
    • 알고리즘 (160)
      • 백준 (132)
      • 프로그래머스 (8)
      • SWEA (20)
    • 토이 프로젝트 (14)
      • 간단한 Springboot CRUD (1)
      • 게시판 프로젝트 (13)
    • 알고리즘 개념정리 (8)
    • 오류 해결 (13)
    • 보류 (0)
    • AWS (5)
    • 트러블 슈팅 (0)
    • 회고 (3)
    • CS (4)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

최근 글

티스토리

hELLO · Designed By 정상우.
코딍코딍
알고리즘/백준

7562번 : 나이트의 이동

알고리즘/백준

7562번 : 나이트의 이동

2022. 8. 25. 13:53

https://www.acmicpc.net/problem/7562

 

7562번: 나이트의 이동

체스판 위에 한 나이트가 놓여져 있다. 나이트가 한 번에 이동할 수 있는 칸은 아래 그림에 나와있다. 나이트가 이동하려고 하는 칸이 주어진다. 나이트는 몇 번 움직이면 이 칸으로 이동할 수

www.acmicpc.net

 

 

문제

 

 

코드

import java.io.*;
import java.util.*;

public class Main {
    static int[][] g;
    static int dx[] = {-1, -2, -2, -1, 1, 2, 2, 1};
    static int dy[] = {-2, -1, 1, 2, 2, 1, -1, -2};
    static int l;
    static int startX;
    static int startY;
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringBuilder sb = new StringBuilder();
        int t = Integer.parseInt(br.readLine());

        for(int i=0;i<t;i++) {
            l = Integer.parseInt(br.readLine());
            g = new int[l][l];
            StringTokenizer st = new StringTokenizer(br.readLine(), " ");
            startX = Integer.parseInt(st.nextToken());
            startY = Integer.parseInt(st.nextToken());
            st = new StringTokenizer(br.readLine(), " ");
            int endX = Integer.parseInt(st.nextToken());
            int endY = Integer.parseInt(st.nextToken());

            g[startX][startY] = 0;
            bfs(startX, startY);
            sb.append(g[endX][endY]+"\n");
        }
        bw.write(sb+"");
        bw.flush();
    }

    public static void bfs(int i, int j) {
        Queue<int[]> q = new LinkedList<>();
        q.add(new int[]{i, j});
        while(!q.isEmpty()) {
            int node[] = q.poll();
            i = node[0];
            j = node[1];
            for (int k = 0; k < 8; k++) {
                int x = i + dx[k];
                int y = j + dy[k];
                if (x < 0 || y < 0 || x >= l || y >= l || (x==startX && y==startY)) continue;
                if (g[x][y] == 0) {
                    g[x][y] = g[i][j] + 1;
                    q.add(new int[]{x, y});
                }
            }
        }
    }
}

 

 

해결방법

bfs를 사용하였고 이동할때마다 이전 칸의 값+1을 해주면몇  번만에 해당 칸으로 이동했는 지 알 수 있어 문제를 해결할 수 있다.

45L의 범위를 벗어나면 continue; 하도록 한 코드의 조건에 (x==startX && y==startY) 를 추가한 이유는 이를 추가해야 출발좌표와 도착좌표가 동일할 때 결과값이 0이 나오기 때문이다.

'알고리즘 > 백준' 카테고리의 다른 글

7795번 : 먹을 것인가 먹힐 것인가  (0) 2022.08.31
2468번 : 안전 영역  (0) 2022.08.27
4963번 : 섬의 개수  (0) 2022.08.23
7576번 : 토마토  (0) 2022.08.23
11724번 : 연결 요소의 개수  (0) 2022.08.21
  • 문제
  • 코드
  • 해결방법
'알고리즘/백준' 카테고리의 다른 글
  • 7795번 : 먹을 것인가 먹힐 것인가
  • 2468번 : 안전 영역
  • 4963번 : 섬의 개수
  • 7576번 : 토마토
코딍코딍
코딍코딍
ㅎ2

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.