My solutions for the 2012 mebipenny
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 

74 lines
1.7 KiB

import sys
from collections import defaultdict
from itertools import product
_around_stencil = [(i, j) for i, j in product([-1, 0, 1], repeat=2)
if (i, j) != (0, 0)]
def empty_board(n, m):
board = []
for i in xrange(N):
board.append([False] * m)
return board
def around(I, J):
def f(i, j):
for _i, _j in _around_stencil:
yield (i + _i, j + _j)
return f(I, J)
N, M, K = [int(i) for i in sys.stdin.readline().split()]
board = empty_board(N, M)
bombs = []
for line in range(K):
x, y = [int(i) for i in sys.stdin.readline().strip().split()]
board[x][y] = True
bombs.append((x, y))
click = tuple(int(i) for i in sys.stdin.readline().strip().split())
if click in bombs:
sys.exit()
adjacent_to_bombs = defaultdict(int)
for bomb in bombs:
for ni, nj in around(*bomb):
if ni >= 0 and nj >= 0 and ni < N and nj < M and [ni, nj] not in bombs:
adjacent_to_bombs[ni, nj] += 1
if tuple(click) in adjacent_to_bombs.keys():
sys.exit()
for line in board:
print line
unobscured = {}
visited = {}
def seek_and_destroy(dude, unobscured):
if dude in unobscured:
return
unobscured[dude] = True
to_recurse = {}
for ni, nj in around(*dude):
if (ni >= 0 and nj >= 0 and ni < N and nj < M) and \
((ni, nj) not in bombs):
candidate = (ni, nj)
unobscured[candidate] = True
to_recurse[candidate] = True
print ">>>", to_recurse.keys()
for c in to_recurse.keys():
seek_and_destroy(c, unobscured)
seek_and_destroy(click, unobscured)
print "\n\n"
print "\n".join('{} {}'.format(*i) for i in sorted(unobscured.keys()))