BFS vs DFS
public class Main{
static int N, M, V; //정점 수, 간선 수, 시작 노드
static int[][] graph;
static boolean[] visited;
public static void main(String[] args) {
/*
이 곳에 입력 및 배열 초기화를 진행하고, 배열크기에 맞게 visited배열 선언
*/
bfs(V);
}
//너비 우선 탐색 (그래프로 풀 경우 간선의 존재 유무만 체크하면 됨)
static void bfs(int idx) {
Queue<Integer> queue = new LinkedList<Integer>(); //큐 선언
queue.add(idx); //큐에 시작지점을 추가
visited[idx] = true; //방문체크
while(!queue.isEmpty()){ //큐가 빌 때까지 무한루프
int s =queue.poll(); //현재 큐에 들어있는 맨 앞의 값을 꺼냄
for(int i =1; i< graph.length;i++){ //그래프의 길이만큼 반복하면서
if(graph[s][i] == 1 && !visited[i]){ //간선이 있을 때&&방문하지 않은 경우
queue.add(i); //큐에 계속해서 추가
visited[i] = true; //방문체크
}
}
}
}
}class Point{ //좌표값을 저장하기 위한 Point 클래스
int x;
int y;
public Point(int x, int y){
this.x = x;
this.y = y;
}
}
public class Main{
static int[] dx = new int[] {-1, 0, 1, 0}; //방향벡터
static int[] dy = new int[] {0, 1, 0, -1}; //방향벡터
static int N, M, V; //정점 수, 간선 수, 시작 노드
static int[][] map;
static boolean[][] visited;
public static void main(String[] args) {
/*
이 곳에 입력 및 배열 초기화를 진행하고, 배열크기에 맞게 visited배열 선언
*/
bfs(0, 0); //어디서부터 탐색을 할 지
}
//너비 우선 탐색 (그래프가 아닌 단순 2차원 배열 좌표값을 활용할 때
static void bfs(int x, int y) {
Queue<Point> q = new LinkedList<>(); //큐 선언
visited[x][y] = true; //시작지점 방문체크
q.offer(new Point(x,y)); //큐에 시작지점 추가
while(!queue.isEmpty()){ //큐가 빌 때까지 무한루프
Point p = q.poll(); // 맨 앞의 큐를 꺼내고
for (int i = 0; i < 4; i++) { //큐에서 꺼낸 인덱스로부터 사방탐색
if (p.x + dx[i] < 0 || p.x + dx[i] > N - 1 || p.y + dy[i] < 0 || p.y + dy[i] > N - 1) continue; //Null 예외 처리
if(특정 조건 값){
visited[p.x + dx[i]][p.y + dy[i]] = true; //방문 체크
q.offer(new Point(p.x + dx[i], p.y + dy[i])); //탐색을 위한 큐 추가
}
//4방탐색을 돌면서 해야할 조건들을 추가**
}
}
}
}