Compute a matriz de campo minado (minesweeper)
a) Escreva uma função que recebe como parâmetros uma matriz inteira Anxm
, e uma posição (i,j)
da matriz, e conta quantas posições ao redor da posição (i,j)
contém o valor -1.
b) Escreva um programa que lê uma matriz Anxm
de 0's (posições livres) e -1's (minas). Utilizando a função do item anterior, o programa deve computar e imprimir a quantidade de minas ao redor de cada posição livre da matriz.
Exemplo
Para a matriz
0 | 0 | 0 | 0 | 0 |
0 | -1 | -1 | -1 | 0 |
0 | 0 | 0 | 0 | 0 |
0 | 0 | -1 | 0 | 0 |
a saída deve ser:
1 | 2 | 3 | 2 | 1 |
1 | -1 | -1 | -1 | 1 |
1 | 3 | 4 | 3 | 1 |
0 | 1 | -1 | 1 | 0 |
if
s na função conta_minas()
)¶def main():
m = int(input("Digite o número de linhas da matriz A: "))
n = int(input("Digite o número de colunas da matriz A: "))
A = le_matriz(m,n)
print("Matriz lida:")
imprime_matriz(A)
for i in range(m):
for j in range(n):
if A[i][j] == 0:
A[i][j] = conta_minas(A,i,j)
print("Matriz de resultado:")
imprime_matriz(A)
def conta_minas(matriz, i, j):
"""
(list, int, int) --> int
Função que recebe como parâmetro uma matriz e uma posição (i,j)
dessa matriz e devolve a quantidade de posições ao redor da posição
(i,j) que contêm o valor -1 nessa matriz.
"""
cont = 0
# Verifica a posição à esquerda
if j-1 >= 0 and matriz[i][j-1] == -1:
cont +=1
# Verifica a posição à direita
if j+1 < len(matriz[i]) and matriz[i][j+1] == -1:
cont +=1
# Verifica as posições acima
if i-1 >= 0:
if matriz[i-1][j] == -1:
cont +=1
if j-1 >= 0 and matriz[i-1][j-1] == -1:
cont +=1
if j+1 < len(matriz[i]) and matriz[i-1][j+1] == -1:
cont +=1
# Verifica as posições abaixo
if i+1 < len(matriz):
if matriz[i+1][j] == -1:
cont +=1
if j-1 >= 0 and matriz[i+1][j-1] == -1:
cont +=1
if j+1 < len(matriz[i]) and matriz[i+1][j+1] == -1:
cont +=1
return cont
def le_matriz(m, n):
"""
(int, int) --> list
Função que recebe como entrada um número de linhas m
e um número de colunas n e então lê uma matriz de inteiros
tamanho m x n, ou seja, uma lista contendo m listas
com n elementos cada. A matriz lida é devolvida como
valor de retorno da função.
"""
print("Digite os elementos da matriz de tamanho %dx%d:" %(m,n))
matriz = []
for i in range(m):
matriz.append([])
for j in range(n):
elemento = int(input("Elemento da %da. linha, %da. coluna: " %(i+1,j+1)))
matriz[i].append(elemento)
return matriz
def imprime_matriz(matriz):
"""
(list) --> None
Função que recebe uma matriz como entrada, ou seja uma
lista de listas, e então a imprime.
A função não tem nenhum valor de retorno.
"""
for linha in matriz:
for elemento in linha:
print("%2d" %elemento, end = " ")
print()
################
main()
conta_minas()
)def main():
m = int(input("Digite o número de linhas da matriz A: "))
n = int(input("Digite o número de colunas da matriz A: "))
A = le_matriz(m,n)
print("Matriz lida:")
imprime_matriz(A)
for i in range(m):
for j in range(n):
if A[i][j] == 0:
A[i][j] = conta_minas(A,i,j)
print("Matriz de resultado:")
imprime_matriz(A)
def conta_minas(matriz, i, j):
"""
(list, int, int) --> int
Função que recebe como parâmetro uma matriz e uma posição (i,j)
dessa matriz e devolve a quantidade de posições ao redor da posição
(i,j) que contêm o valor -1 nessa matriz.
"""
cont = 0
for incremento_linha in [-1, 0, 1]: # queremos olhar para as linhas i-1, i e i+1
for incremento_coluna in [-1, 0, 1]: # queremos olhar para as colunas j-1, j e j+1
# se a posição matriz[i+incremento_linha][j+incremento_coluna] é válida e não é a própria matriz[i][j],
# verifica se ela contém uma mina
if (0 <= i+incremento_linha < len(matriz) and 0 <= j+incremento_coluna < len(matriz[i]) and # posição é válida?
not (incremento_linha == 0 and incremento_coluna == 0) and # a posição não é a própria (i,j)?
matriz[i+incremento_linha][j+incremento_coluna] == -1): # tem mina?
cont += 1
return cont
def le_matriz(m, n):
"""
(int, int) --> list
Função que recebe como entrada um número de linhas m
e um número de colunas n e então lê uma matriz de inteiros
tamanho m x n, ou seja, uma lista contendo m listas
com n elementos cada. A matriz lida é devolvida como
valor de retorno da função.
"""
print("Digite os elementos da matriz de tamanho %dx%d:" %(m,n))
matriz = []
for i in range(m):
matriz.append([])
for j in range(n):
elemento = int(input("Elemento da %da. linha, %da. coluna: " %(i+1,j+1)))
matriz[i].append(elemento)
return matriz
def imprime_matriz(matriz):
"""
(list) --> None
Função que recebe uma matriz como entrada, ou seja uma
lista de listas, e então a imprime.
A função não tem nenhum valor de retorno.
"""
for linha in matriz:
for elemento in linha:
print("%2d" %elemento, end = " ")
print()
################
main()
a) Escreva uma função que recebe como parâmetros uma matriz real Anxm
, e uma posição (i,j)
da matriz, e calcula a média aritmética dos vizinhos de (i,j)
, ou seja, a média entre A[i-1][j]
, A[i+1][j]
, A[i][j-1]
e A[i][j+1]
. Desconsidere os vizinhos que não pertencem a matriz (por exemplo, os vizinhos de (0,0)
são somente (0,1)
e (1,0)
).
b) Escreva uma função que recebe como parâmetro uma matriz real Anxm
e devolve uma matriz Amédia
, onde Amédia[i][j]
é a média aritmética dos vizinhos de (i,j)
. Para isto, utilize a função do item anterior.
c) Escreva um programa que lê uma matriz real Anxm
, e um número inteiro k
; utilizando a função do item anterior, o programa deve transformar a matriz k
vezes, imprimindo a matriz inicial e depois de cada transformação.
Obs.: Este problema corresponde ao exercício 13 da lista de exercícios sobre funções - Parte III.
def main():
m = int(input("Digite o número de linhas da matriz A: "))
n = int(input("Digite o número de colunas da matriz A: "))
A = le_matriz(m,n)
k = int(input("Digite o numero k de transformacoes em A:"))
print("Matriz lida:")
imprime_matriz(A)
for i in range(k):
A = matriz_media(A)
print("Matriz de resultado (transformaçao %d):" %(i+1))
imprime_matriz(A)
def media_vizinhos(A,i,j):
"""
(list,int,int) --> float
Função que recebe uma matriz e um posição (i,j) desta matriz e
devolve a média dos valores das posições ao redor de (i,j).
"""
cont = 0
soma = 0
# Soma o valor da posição à esquerda
if j-1 >= 0:
cont +=1
soma += A[i][j-1]
# Soma o valor da posição à direita
if j+1 < len(A[i]):
cont +=1
soma += A[i][j+1]
# Soma o valor da posição acima
if i-1 >= 0:
cont +=1
soma += A[i-1][j]
# Soma o valor da posição abaixo
if i+1 < len(A):
cont +=1
soma += A[i+1][j]
return soma/cont
def matriz_media(A):
"""
(list) --> list
Função que recebe uma matriz A de reais e devolve uma nova matriz
onde cada posição (i,j) possui o valor da média dos valores dos
vizinhos da posição (i,j) em A.
"""
A_media = []
for i in range(len(A)):
A_media.append([])
for j in range(len(A[i])):
A_media[i].append(media_vizinhos(A,i,j))
return A_media
def le_matriz(m, n):
"""
(int, int) --> list
Função que recebe como entrada um número de linhas m
e um número de colunas n e então lê uma matriz de reais
tamanho m x n, ou seja, uma lista contendo m listas
com n elementos cada. A matriz lida é devolvida como
valor de retorno da função.
"""
print("Digite os elementos da matriz de tamanho %dx%d:" %(m,n))
matriz = []
for i in range(m):
matriz.append([])
for j in range(n):
elemento = float(input("Elemento da %da. linha, %da. coluna: " %(i+1,j+1)))
matriz[i].append(elemento)
return matriz
def imprime_matriz(matriz):
"""
(list) --> None
Função que recebe uma matriz real como entrada, ou seja uma
lista de listas, e então a imprime.
A função não tem nenhum valor de retorno.
"""
for linha in matriz:
for elemento in linha:
print("%6.2f" %elemento, end = " ")
print()
##########
main()