코테 대비 python/백준

4396 지뢰찾기

ylab 2023. 3. 13. 16:49

https://www.acmicpc.net/problem/4396

 

4396번: 지뢰 찾기

지뢰찾기는 n × n 격자 위에서 이루어진다. m개의 지뢰가 각각 서로 다른 격자 위에 숨겨져 있다. 플레이어는 격자판의 어느 지점을 건드리기를 계속한다. 지뢰가 있는 지점을 건드리면 플레이어

www.acmicpc.net

#인접한 8개의 칸에 지뢰가 몇개 있었는지 알려주는 0~8사이의 숫자가 나타남
#n이 10이하이므로 브르투포스 가능할 것으로 보임 
#따라서 주어진 조건을 만족하는 깡구현
#맨처음 n개는 지뢰위치 그다음 n개는 연것들의 위치

n = int(input())
mine = [input().rstrip() for _ in range(n)]
open = [input().rstrip() for _ in range(n)]
result = [[0]*n for _ in range(n)]
#print(mine)
#상하좌우 대각선
dx = [-1,1,0,0,-1,-1,1,1]
dy = [0,0,-1,1,-1,1,1,-1]
#만약 지뢰라면?? 지뢰의 위치를 미리 받자??
loc = []
for i in range(n):
    for j in range(n):
        if mine[i][j] =='*':
            loc.append((i,j))
        
def count_mine(x,y):
    cnt=0
    for i in range(8):
        nx = x+dx[i]
        ny = y+dy[i]
        #범위안에 있다면, 지뢰라면?
        if 0<=nx<n and 0<=ny<n : 
            if mine[nx][ny]=='*':
                cnt+=1
    result[x][y]=cnt


flag=0  
for i in range(n):
    for j in range(n):
        #만약 열었다면
        if open[i][j]=='x':
            #열었는데 지뢰아니라면
            if mine[i][j] =='.':
                #print(1)
                count_mine(i,j)
            #지뢰면 flag =1 
            elif mine[i][j] =='*':
                flag=1
                
                
        #안열었다면
        elif open[i][j]=='.':
            result[i][j]='.'
#마지막에 다 꼬이나보다 그러면 flag주자        
if flag==1:
    for k in loc:
        a,b=k
        result[a][b]='*'

for h in result:
    for l in h:        
        print(l,end='')
    print()