python 迷宫生成题目_校招题目:用计算机生成迷宫

这是我初学python时写的一个校招题目,这个程序还有不少问题,仅供参考。

校招题目

用计算机生成迷宫是一个很有趣的任务。我们可以用 ​道路网格(Road Grid)​ ​来表示迷宫的道路,那么 3 x 3

的 ​道路网格​(​图-1 左​)可以对应一个 7 x 7 的 ​渲染网格(Render Grid)​ ——​图-1 右​ 的方式(迷宫的墙是灰

色的,道路是白色的):

如果我们将迷宫 ​道路网格​ 两个相邻的 ​cell​ 连通,则可以打通道路。如 ​图-2 ​ 所示:

连通 ​道路网格​ 有如下的约束条件:

● 每一个 ​cell​ 只能够直接与相邻正南、正北、正东、正西的 ​cell​ 连通。不能够和其他的 ​cell​ 连通。

● 两个 ​cell​ 之间的连通一定是双向的。即 ​cell(0,0) ​和 ​cell(1,0)​ 连通等价于 ​cell(1,0)​ 和cell(0,0)​ 的连通。

要求1:将迷宫渲染为字符串

现在我们希望你书写程序,将给定迷宫的 ​道路网格​,渲染为字符串输出。例如,其使用方式如下(伪代码

,仅做演示,实际实现时请应用实际语言的编程风格)

Maze maze = MazeFactory.Create(command);

String mazeText = maze.Render();

其中 command 是一个字符串。它的定义如下:

● 第一行是迷宫 ​道路网格​ 的尺寸。例如 3 x 3 的迷宫为 ​3 3​,而 5 x 4 的迷宫为 ​5 4​(5 行 4 列)​。

● 第二行是迷宫 ​道路网格​ 的连通性定义。如果 ​cell(0,1) ​和​ cell(0,2) ​是连通的,则表示为:

0,1 0,2​,多个连通以分号 ​; ​隔开。

例如,如果给定输入:

3 3

0,1 0,2;0,0 1,0;0,1 1,1;0,2 1,2;1,0 1,1;1,1 1,2;1,1 2,1;1,2 2,2;2,0 2,1

则输出字符串为(如果当前 渲染网格 为墙壁,则输出 [W] 如果为道路则输出 [R]):

[W] [W] [W] [W] [W] [W] [W]

[W] [R] [W] [R] [R] [R] [W]

[W] [R] [W] [R] [W] [R] [W]

[W] [R] [R] [R] [R] [R] [W]

[W] [W] [W] [R] [W] [R] [W]

[W] [R] [R] [R] [W] [R] [W]

[W] [W] [W] [W] [W] [W] [W]

Readme

使用语言:python

程序如下:

import re

class FormatError(Exception):

pass

try:

while(1):

m = int(input("\nm = "))

n = int(input("n = "))

N = [['[W]']*(n*2+1) for i in range(m*2+1)]

for x in range(m*2+1):

for y in range(n*2+1):

if x%2 == 1 and y%2 == 1:

N[x][y] = "[R]"

for i in range(m*2+1):

print("\n")

for j in range(n*2+1):

print(N[i][j],end=" ")

print("\n\ninput way to go: ")

line = input()

linestr = line.split(";")

for i in range(0, len(linestr)):

r = re.split(r"[\s+\,]",linestr[i])

for j in range(0, 4):

if(r[0]!=r[2] and r[1]!=r[3]):

raise FormatError("Maze format error.")

else:

N[int(r[0])+int(r[2])+1][int(r[1])+int(r[3])+1] = "[R]"

for i in range(m*2+1):

print("\n")

for j in range(n*2+1):

print(N[i][j],end=" ")

except FormatError as e:

print(e)

except NameError:

print("Invalid number format​.")

except ValueError:

print("Incorrect command format​.​​")

except IndexError:

print("Number out of range​.")

except KeyboardInterrupt:

print("Programme quit.")1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

1、首先运行程序,输入迷宫的高(m)和宽(n):

2、接着选择去哪个方向的道路,它会生成如下的图:

3、接着你又可以构造自己的迷宫,但是当选择的路无法连通时,会出现如下问题:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要使用OpenCV和Python来解决迷宫问题,可以使用图像处理和路径搜索算法。以下是一个基本的实现示例: 1. 导入必要的库: ```python import cv2 import numpy as np ``` 2. 加载迷宫图像并进行预处理: ```python maze = cv2.imread('maze_image.jpg', 0) ret, thresh = cv2.threshold(maze, 127, 255, cv2.THRESH_BINARY) ``` 3. 定义起点和终点坐标: ```python start = (50, 50) # 起点坐标 end = (400, 400) # 终点坐标 ``` 4. 定义可行走方向和移动步长: ```python directions = [(-1, 0), (1, 0), (0, -1), (0, 1)] # 上下左右四个方向 step_size = 10 # 移动步长 ``` 5. 创建路径搜索函数: ```python def search_path(current_pos): if current_pos == end: return True for direction in directions: next_pos = (current_pos[0] + direction[0] * step_size, current_pos[1] + direction[1] * step_size) if is_valid_move(next_pos): if search_path(next_pos): return True return False ``` 6. 创建检查移动是否有效的函数: ```python def is_valid_move(pos): if pos[0] < 0 or pos[0] >= maze.shape[0] or pos[1] < 0 or pos[1] >= maze.shape[1]: return False if thresh[pos[0], pos[1]] == 0: return False return True ``` 7. 调用路径搜索函数并显示结果: ```python result = search_path(start) if result: print("找到了最短路径!") else: print("无法找到最短路径!") cv2.imshow("Maze", maze) cv2.waitKey(0) cv2.destroyAllWindows() ``` 这是一个简单的迷宫问题解决示例,它使用OpenCV加载和处理图像,并使用递归路径搜索算法来查找起点到终点的最短路径。根据具体的迷宫图像和需求,可能需要进行适当的调整和优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值