사이트 #18428 감시 피하기:BFS/ 난이도

🚩플로우 (선택)

코드를 풀이할 때 적었던 플로우가 있나요?

🚩제출한 코드

import sys
def backtracking(cnt):
    global flag

    # 3개 장애믈 설치 끝나면
    if cnt == 3 :
        # 선생님들 위치에서 감시
        if check_S():
            flag = True # 성공하면 flag를 True로 초기화
            return True
    else : # 모든 빈 공간에 장애물 3개씩 설치해보기
        for x  in range(n):
            for y in range(n) :
                if graph[x][y] == "X":
                    graph[x][y] = "O"
                    backtracking(cnt+1) # backtraking
                    graph[x][y] = "X" 
        

def check_S() : 
    #check_S : 선생님 시야 함수 (bfs -> 근데 dfs에 가깝지 않나???)
    #check = True # T가 S 를 못 찾음
    
    # 상하좌우 움직이는 배열
    dx = [1,-1,0,0]
    dy = [0,0,1,-1]
    
    for t in teachers : # 선생님 위치에서
        
        for k in range(4): #상하좌우 탐색
            nx = t[0] + dx[k]
            ny = t[1] + dy[k]
            # 선생님 x,y 좌표
            while  0 <= nx < n and 0 <= ny < n : # graph 범위 밖 넘어가는 것 차단
                if graph[nx][ny] == "O" : #방애물 있으면 해당 방향 스킵
                    break
                if graph[nx][ny] == "S"  : # S 가 있으면 실패
                     return False
                nx += dx[k]
                ny += dy[k]

    # 모두 통과하면 S가 안보이는 것으로 성공
    return True
        

# input 받기 -  graph , T 위치 , X 위치
n = int(sys.stdin.readline())
flag = False # (답) 전체 시야 차단 yes or no  
graph = [] # 전체 MAP 위치
teachers = list () # 선생님 (T) 좌표

for i in range(n):
    graph.append(list(map(str , sys.stdin.readline().split())))
    for j in range(n):
        if graph[i][j] == "T": # 선생님 있는 좌표 저장
            teachers.append([i,j])

# BFS 
backtracking(0)

if flag :
    print("YES")
else :
    print("NO")
"""
role : 1. T , S , O 
T - 상하좌우 like 룩  
  - 장애물 막히면 뒤에 못봄

1. T 가 볼 수 있는 영역

2. 학생 위치 

3. 3개의 장애물을 통해 모든 S 가 생존하기

"""
def student_check(position, graph) :
    # T's position = [x,y]
    # [x+dx , y] , [x-dx , y] , [x,y+dy] , [x.y-dy]
    #check = True # T가 S 를 못 찾음
    x,y = position[0] , position[1]
    dn = 1
    for r in [[x+dn , y] , [x-dn , y] , [x,y+dn] , [x.y-dn]]:
         #상하좌우 
        while r[0] >= 0 or r[0] < n or r[1] >= 0 or r[1] <n : # 범위 밖으로 넘어가면 생략
            if graph[r[0]][r[1]] == "O" : #방애물 있으면 해당 방향 스킵
                break
            if graph[r[0]][r[1]] == "S"  : # S 가 있으면
                return False
            dn +=1
        dn = 0
   
    return True
        

# input 받기 
n = int(input())
graph = [[] for _ in range(n)] # 전체 MAP 위치
empty_p = list() # 빈 공간(x) 좌표 
for i in range(n):
    tmp = list(input().split())
    for j in range(n):
        if tmp[j] == "X" :
            empty_p.append([i,j])
    graph[i]= tmp
print(graph)
print(empty_p)
print("_____")

# BFS 

💡TIL

배운 점이 있다면 입력해주세요

Untitled

3x3 행렬 선택 게임

아래와 같은 행렬이 존재할 때 3개의 숫자를 선택하는 게임이다. 단, 선택한 숫자들의 행과 열은 모두 중복하면 안된다. 가장 적은 점수를 얻는 것이 승리하는 것이라 할때 선택해야하는 숫자 3개를 골라보자.

Untitled

Untitled

Untitled

import sys

li = [[1,5,3],[2,5,7],[5,3,5]]
chk = [False]*3
m = sys.maxsize

def backtracking(row, score):
	if row == 4: # 재귀함수를 마치는 조건
		if score < m:
			return
	for i in range(1,4):
		if chk[i] == false: # 백트래킹에서의 한정조건
			chk[i] = true
			backtracking(row+1, score + li[row][i])
			chk[i] = false
	return 

backtracking(1,0)
print(m)