So I'm trying to make a graph of letters (to represent a boggle board) from a matrix of letters. So say I have something like:
[ [ A, B, C, D],
[E, F, G, H],
[I, J, K, L],
[M, N, O, P] ].
I want each node to be a letter, but I'm having trouble figuring out how to get the neighbors for each node. For example, node A would have neighbors B, E, and F. While node K would have neighbors F, G, H, J, L, M, O, and P. Any help would be appreciated!
You could loop through every node in your matrix and then add every neighboring node at right & below to the result:
matrix = [
['A', 'B', 'C', 'D'],
['E', 'F', 'G', 'H'],
['I', 'J', 'K', 'L'],
['M', 'N', 'O', 'P']
]
def add(adj_list, a, b):
adj_list.setdefault(a, []).append(b)
adj_list.setdefault(b, []).append(a)
adj_list = {}
for i in range(len(matrix)):
for j in range(len(matrix[i])):
if j < len(matrix[i]) - 1:
add(adj_list, matrix[i][j], matrix[i][j+1])
if i < len(matrix[i]) - 1:
for x in range(max(0, j - 1), min(len(matrix[i+1]), j+2)):
add(adj_list, matrix[i][j], matrix[i+1][x])
import pprint
pprint.pprint(adj_list)
Output:
{'A': ['B', 'E', 'F'],
'B': ['A', 'C', 'E', 'F', 'G'],
'C': ['B', 'D', 'F', 'G', 'H'],
'D': ['C', 'G', 'H'],
'E': ['A', 'B', 'F', 'I', 'J'],
'F': ['A', 'B', 'C', 'E', 'G', 'I', 'J', 'K'],
'G': ['B', 'C', 'D', 'F', 'H', 'J', 'K', 'L'],
'H': ['C', 'D', 'G', 'K', 'L'],
'I': ['E', 'F', 'J', 'M', 'N'],
'J': ['E', 'F', 'G', 'I', 'K', 'M', 'N', 'O'],
'K': ['F', 'G', 'H', 'J', 'L', 'N', 'O', 'P'],
'L': ['G', 'H', 'K', 'O', 'P'],
'M': ['I', 'J', 'N'],
'N': ['I', 'J', 'K', 'M', 'O'],
'O': ['J', 'K', 'L', 'N', 'P'],
'P': ['K', 'L', 'O']}