BFS

BFS-미로찾기

Posted by 동식이 블로그 on March 5, 2019

bfs

미로크기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# 2차원 배열의 bfs는 대부분 동일한 코드
## 코드를 말로 풀어서 이해하기
### 24번의 if조건만 다르게 해서 나옴
def bfs(i, j, n):
    # 인접칸 조사를 위한 델타
    di = [0,1,0,-1]
    dj = [1,0,-1,0]

    q = [] # 큐생성
    visited = [[0]*n for i in range(n)] # n개의 0으로 초기화
    q.append(i) # 시작점 인큐
    q.append(j)
    visited[i][j] = 1 # (인큐와 visited를 묶어서) 시작점에 방문 표시
    while(len(q) != 0): # 큐가 비어있지 않으면
        i = q.pop(0) # 디큐 (맨 앞에서 꺼내는 거니까)
        j = q.pop(0) 
        # pop한애가 처리할 위치
        if(maze[i][j] == 3): # 목적지이면 디큐한 칸 처리 
            return (visited[i][j] - 2)
        for k in range(4): # 인접한 4방항에 대해서
            ni = i + di[k]
            nj = j + dj[k]
            if(ni >=0 and ni < n and nj >=0 and nj < n): # 미로를 벗어나지 않으면
                if(maze[ni][nj] != 1 and visited[ni][nj] == 0): # 벽이 아니고, 방문하지 않았으면
                    # 큐에 넣는다
                    q.append(ni)
                    q.append(nj)
                    visited[ni][nj] = visited[i][j] + 1
    return 0
                
    



T = int(input())

for tc in range(T):
    n = int(input())
    maze = [ [int(x) for x in input()] for i in range(n)]
    for i in range(n):
        for 2 in maze[i]:
            sRow = i
            sCol = maze[i].index(2)
    
    print("#{} {}".format(tc+1, bfs(sRow, sCol, n)))

노드사이의 거리

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# visited안에 거리정보다 들어가도록
## 인접행렬
def bfs(s, g, v):
    # 1.큐생성
    q = []
    # 2.visited
    visited = [0]*(v+1)
    # 3.시작점 인큐
    q.append(s)
    # 4.시작점 방문 표시
    visited[s] = 1
    while(len(q) != 0): # 큐가 비어있지 않으면
        n = q.pop(0) # 디큐
        if(n == g): # 목적지에 도달하면
            return visited[g] -1 
        for i in range(1, v+1): # 모든 노드에 대해
            if(adj[n][i] != 0 and visited[i] == 0): # n에 인접이고, 미방문이면
                q.append(i) # 인큐
                visited[i] = visited[n] + 1
    return 0         
                            
T = int(input())
for tc in range(T):
    v, e = map(int, input().split())
    adj = [ [0]*(v+1) for i in range(v+1)]
    for i in range(e):
        n1, n2 = list(map(int, input().split()))
        # 방향성이 없기 때문에 1,3이 연결되면 (1,3) / (3,1) 둘다 1 저장
        adj[n1][n2] = 1
        adj[n2][n1] = 1 
    s, g = map(int, input().split())
    
    print("#{} {}".format(tc+1, bfs(s,g,v)))
    

숨바꼭질

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
def bfs(x, k):
    # 1~4 초기화
    # 1. 큐생성
    q = []
    # 2. visited생성
    visited = [0]*(100001)
    # 3. 인큐
    q.append(x)
    # 4. 시작점 방문 표시
    visited[x] = 1
    while(len(q) != 0):
        x = q.pop(0)
        if(x == k):
            return (visited[k] -1)
        # x-1이 인접이면서 방문하지 않았을 경우 // 무조건 x-1의 인접 확인이  앞에와야함
        if(x-1 >= 0 and visited[x-1] == 0):
            q.append(x-1)
            visited[x-1] = visited[x] + 1
        # x+1이 인접인 경우
        if(x+1 <= 100000 and visited[x+1] == 0):
            q.append(x+1)
            visited[x+1] = visited[x] + 1
        # 2*x 가 인접인 경우
        if(2*x <= 100000 and visited[2*x] == 0):
            q.append(2*x)
            visited[2*x] = visited[x] + 1
    return 0

# x, k = map(int, input().split())
x = 5
k = 17
print(bfs(x, k))