Jam's story

[백준] 7562번 나이트의 이동 - java 본문

코딩테스트/백준

[백준] 7562번 나이트의 이동 - java

애플쩀 2022. 8. 4. 05:31
  • 움직이는 변화방향이 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));
			}
		}
	}
}
}
Comments