maze/maze/__init__.py

84 lines
2.5 KiB
Python

import copy
from random import randint
class CS235Maze(object):
def __init__(self, data):
self._data = data
self._size = len(data)
def _solve(self, x, y, z, visited):
print x, y, z
if all(i == self._size - 1 for i in (x, y, z)):
return True
if x - 1 >= 0 and (x - 1, y, z) not in visited:
_v = copy.deepcopy(visited)
_v.add((x - 1, y, z))
return self._solve(x - 1, y, z, _v)
if x + 1 < self._size and self._data[x + 1][y][z] and (x + 1, y, z) not in visited:
_v = copy.deepcopy(visited)
_v.add((x + 1, y, z))
return self._solve(x + 1, y, z, _v)
if y - 1 >= 0 and (x, y - 1, z) not in visited:
_v = copy.deepcopy(visited)
_v.add((x, y - 1, z))
self._solve(x, y - 1, z, _v)
if y + 1 < self._size and self._data[x][y + 1][z] and (x, y + 1, z) not in visited:
_v = copy.deepcopy(visited)
_v.add((x, y + 1, z))
return self._solve(x, y + 1, z, _v)
if z - 1 >= 0 and (x, y, z - 1) not in visited:
_v = copy.deepcopy(visited)
_v.add((x, y, z - 1))
return self._solve(x, y, z - 1, _v)
if z + 1 < self._size and self._data[x][y][z + 1] and (x, y, z + 1) not in visited:
_v = copy.deepcopy(visited)
_v.add((x, y, z + 1))
return self._solve(x, y, z + 1, _v)
def solve(self):
return self._solve(0, 0, 0, set())
def __str__(self):
r = derp_transpose(self.data)
rs = ''
for i in xrange(self.size):
for j in xrange(self.size):
for k in xrange(self.size):
rs += '{} '.format(r[i][j][k])
rs += '\n'
rs += '\n'
return rs
def make_maze(size=8):
r = []
for i in xrange(size):
r.append([])
for j in xrange(size):
r[i].append([randint(0, 1) for k in xrange(size)])
r[0][0][0] = 1
r[size - 1][size - 1][size - 1] = 1
return CS235Maze(r, size)
def parse_maze(maze):
soilded = [[[int(i) for i in j.split()]
for j in k.split('\n')]
for k in maze.split('\n\n') if k]
cleaned = derp_transpose(soilded, size=len(soilded))
return CS235Maze(cleaned)
def derp_transpose(s, size=8):
r = copy.deepcopy(s)
for i in xrange(size):
for j in xrange(size):
for k in xrange(size):
r[i][j][k] = s[k][j][i]
return r