Jam's story
[백준] 7562번 나이트의 이동 - java 본문
- 움직이는 변화방향이 8곳이다. 변화량을 8개를 만들어준다.
- 테스트 케이스 갯수와, 배열 크기와, 시작점 ,목표점을 입력받아
- Point로 넣어주고 bfs 함수 실행
- que 에 시작점을 넣어주고
- visited는 방문했는지 안햇는지 판별하는 배열
- que가 비어있지않다면, Point 지점을 가져온다.
- 목표지점과 목표값이 같다면 출력
- 아니라면 8개의 변화를 이동해서 visited 는 true로 ,
- 새로운 좌표에 = 이전좌표+1 (이동량 갯수 세기)
- que 에 새로운 좌표를 넣어준다.
package days01;
import java.awt.Point;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
public class Main {
static int N=0;
static int nX, nY, tX, tY;
static int map[][];
static boolean visited[][];
static int moveX[] = {1,2,2,1,-1,-2,-2,-1};
static int moveY[] = {-2,-1,1,2,2,1,-1,-2};
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int tc=sc.nextInt();
for(int i=0; i<tc; i++) {
N=sc.nextInt();
map=new int[N][N];
nX=sc.nextInt();
nY=sc.nextInt();
tX=sc.nextInt();
tY=sc.nextInt();
Point start=new Point(nX,nY);
Point target=new Point(tX,tY);
bfs(start,target, map);
}
}
public static void bfs(Point start, Point target,int[][] arr) {
Queue<Point> que=new LinkedList<Point>();
que.add(start);
visited=new boolean[arr.length][arr.length];
visited[start.x][start.y]=true;
while(!que.isEmpty()) {
Point p=que.poll();
if(p.x==target.x && p.y==target.y) {
System.out.println(arr[p.x][p.y]);
return ;
}
for(int i=0; i<8; i++) {
int dX=p.x+moveX[i];
int dY=p.y+moveY[i];
if(0<=dX && dX<arr.length && 0<=dY && dY<arr.length && !visited[dX][dY] )
{
visited[dX][dY]=true;
arr[dX][dY]=arr[p.x][p.y]+1;
que.add(new Point(dX,dY));
}
}
}
}
}
visited를 안쓰면
package days01;
import java.awt.Point;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
public class Main {
static int N=0;
static int nX, nY, tX, tY;
static int area[][];
static boolean visited[][];
static int moveX[] = {1,2,2,1,-1,-2,-2,-1};
static int moveY[] = {-2,-1,1,2,2,1,-1,-2};
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int tc=sc.nextInt();
for(int i=0; i<tc; i++) {
N=sc.nextInt();
area=new int[N][N];
nX=sc.nextInt();
nY=sc.nextInt();
tX=sc.nextInt();
tY=sc.nextInt();
Point start=new Point(nX,nY);
Point target=new Point(tX,tY);
bfs(start,target, area);
}
}
public static void bfs(Point start, Point target,int[][] area) {
Queue<Point> que=new LinkedList<Point>();
que.add(start);
visited=new boolean[ area.length][ area.length];
visited[start.x][start.y]=true;
while(!que.isEmpty()) {
Point p=que.poll();
if(p.x==target.x && p.y==target.y) {
System.out.println( area[p.x][p.y]);
return ;
}
for(int i=0; i<8; i++) {
int dX=p.x+moveX[i];
int dY=p.y+moveY[i];
if(0<=dX && dX< area.length && 0<=dY && dY< area.length && area[dX][dY]==0 )
{
area[dX][dY]= area[p.x][p.y]+1;
que.add(new Point(dX,dY));
}
}
}
}
}
'코딩테스트 > 백준' 카테고리의 다른 글
[백준] 나이트의 이동 다시 풀어보기 (BFS) - JAVA (0) | 2022.08.07 |
---|---|
[백준] 2667번 단지번호 붙이기 - java (0) | 2022.08.05 |
[백준] 2178번 미로탐색 (0) | 2022.08.02 |
[2839] 설탕배달 (0) | 2022.05.30 |
[1712번] 손익분기점 (0) | 2022.05.26 |
Comments