#PC/UVa ID: 110102/10189, 인기도: A, 성공율: 높음 레벨: 1
#이 게임에서는 각 칸에 인접한 칸에 몇 개의 지뢰가 있는지를 보여주는 게임이다. 각 칸에는 최대 여덟 개의 인접한 칸이 있을 수 있다. 아래에서 왼쪽에 있는 4 * 4 지뢰밭에는 지뢰 두 개가 있으며 각각은 ‘*’ 문자로 표시되어 있다. 이 지뢰밭을 방금 설명한 힌트 숫자로 표기하면 오른쪽에 있는 것과 같은 필드가 만들어 진다.
#*… *100
#…. 2210
#.*.. 1*10
#…. 1110
#입력
#입력은 임의 개수의 지뢰밭으로 구성된다. 각 지뢰밭의 첫번째 줄에는 각각 행과 열의 개수를 나타내는
#두개의 정수 n과 m(0
#지뢰가 없는 칸은 ‘.’으로, 지뢰는 ‘*’로 표시되며 이때 따옴표는 쓰지 않는다. n=m=0인 줄은 입력이
#끝났음을 나타내는 것으로 그 줄은 처리하지 않는다.
#출력
#각 지뢰밭에 대해 Field #x:라고 적혀있는 메시지를 출력한다. 이때 x는 필드 번호를 나타내며 1에서
#시작한다. 그 다음 줄부터는 n개의 줄에 걸쳐서 ‘.’문자 대신 그 칸에 인접한 칸에 들어있는 지뢰의
#개수를 출력한다. 각 지뢰밭에 대한 출력 사이에는 반드시 빈 줄이 하나씩 있어야 한다.
#예
#입력 예 출력 예
#4 4 Field #1:
#*… *100
#…. 2210
#.*.. 1*10
#…. 1110
#References : ProgrammingChallenges 알고리즘 트레이닝 북
문제가 이렇다… 그럼 파이썬 코드로 보자… [#M_ 코드 보기 | 글 닫기 |
def makeSourceDest(source,dest):
for x in range(I):
source.append(raw_input())
dest.append([])
for y in range(J):
dest[x].append([0])
def getMineCount(source,dest,x,y):
flag = 0
for z in filter(lambda a:0<=a<=I-1, [x-1,x,x+1]):
if flag == 1:
break
for k in filter(lambda b:0<=b<=I-1,[y-1, y, y+1]):
if source[z][k] == ‘*’ and (z!=x or k!=y):
dest[x][y][0] += 1
elif source[z][k] ==’.’:
continue
elif source[z][k] == ‘*’ and z==x and k==y:
dest[x][y][0] = ‘*’
flag = 1
break
if __name__==”__main__”:
i,j = raw_input().split()
I = int(i) # 행
J = int(j) # 열
source = []
dest = []
makeSourceDest(source,dest)
for x in range(I):
for y in range(J):
getMineCount(source,dest,x,y)
strstr =”
for x in range(I):
for y in range(J):
if y ==J-1:
strstr +=str(dest[x][y][0])
strstr += ‘\n’
else:
strstr +=str(dest[x][y][0])
print strstr
_M#]
파이썬으로 ProgrammingChallenges 알고리즘 트레이닝 북 문제풀이 by from __future__ import dream is licensed under a Creative Commons Attribution-NonCommercial 4.0 International License.