这个程序需要sprites模块才能运行,如果没有安装,请用pip install sprites进行安装。
"""
在5行6列的迷宫中,小蚂蚁在(0,0)处.但是它的腿受伤了,
只能在最左上端,也就是行列号(0,0)处,
每次往下或者往右前进一格,那么到达右下端,就是行列号(4,5)处,共有多少种走法?
本程序需要sprites库支持,如果没有安装,请用cmd命令打开管理员,输入
pip install sprites进行安装。不会请联系本人微信:scratch8
"""
from sprites import Sprite
def output(): # 输出路径
s = ""
cnt = 0
for i,j in path[:-1]:
s = s + f"({i},{j})->"
cnt = cnt + 1
if cnt ==5:s = s + "\n"
s = s + f"({path[-1][0]},{path[-1][1]})"
zi.write(s,align='center',font=('',16 ,'normal'))
def move_sprite():
zi.clear()
zi.goto(0,230)
zi.write('第'+str(pen.counter)+'条线路',align='center',
font=('宋体',18,'bold'))
zi.goto(0,170)
output()
pen.clear()
pen.wait(1)
for i,j in path:
pen.goto(cors[i][j])
if not pen.isdown():pen.down()
pen.dot(10,'blue')
pen.wait(0.1)
pen.up()
pen.wait(1.1)
def dfs(r,c): # (r,c)是所到达的行列号
if r==rows-1 and c==cols-1: # 如果到达终点
pen.counter += 1
move_sprite() # 根据path描述移动画笔
else:
for dr,dc in [(0,1),(1,0)]:# 右,下
next_row = r + dr # 下行
next_col = c + dc # 下列
# 如果超出范围,则跳过
if next_row<0 or next_row>=rows or \
next_col<0 or next_col>=cols:continue
path.append((next_row,next_col)) # 记录路径上的点
dfs(next_row,next_col)
path.pop() # 回溯到上一格(将继续选择下一个方向)
path = [ ]
rows,cols = 5,6 # 行列数
bug = Sprite() # 新建角色,用于画格子
bug.pensize(4)
bug.pencolor('blue')
# 画5行,6列格子,50x50,返回所有格子坐标点
cors = bug.draw_grid2(5,6,60,60)
# 下面只是让角色遍历格子,for循环可以去掉
for row in cors:
for x,y in row:
bug.goto(x,y)
bug.wait(0.02)
bug.goto(cors[0][0])
bug.bk(22);bug.addy(5);bug.write((0,0))
bug.goto(cors[rows-1][cols-1])
bug.bk(22);bug.addy(5);bug.write((rows-1,cols-1))
bug.hide()
# 写字的角色
zi = Sprite(visible=False)
zi.goto(0,230)
# 写说明的角色
tt = Sprite(visible=False)
tt.goto(0,280); tt.color('blue')
s = "深 度 优 先 遍 历 迷 宫 ,\n只向右或向下,向右优先。"
tt.write(s,align='center',font=('黑体',22,'normal'))
tt.goto(0,-220); tt.color('magenta')
s = "根据组合数学,所有线路条数是:\nmath.comb(9,5)=126"
tt.write(s,align='center',font=('',18,'normal'))
tt.goto(0,-280); tt.color('purple')
s = "作者:李兴球,博客:www.lixingqiu.com"
tt.write(s,align='center',font=('楷体',15,'normal'))
pen = Sprite(visible=False)
pen.color('red')
pen.width(2)
pen.counter = 0 # 自定义属性,用于计数
path.append((0,0))
dfs(0,0)
下面的C++代码没有加上GUI库,所以不会有显示界面,只会输出线路条数。
#include
#include
using namespace std;
int rows, cols;
int counter = 0;
vector<pair<int, int>> path;
void move_sprite() { //移动画笔画线路
// 实现移动画笔的逻辑,可以用C++的一些GUI库实现。
}
void dfs(int r, int c) {
if (r == rows - 1 && c == cols - 1) { // 如果到达终点
counter++; move_sprite(); // 根据path描述移动画笔
} else {
int dr[] = {0, 1}; // 定义两个方向:右和下
int dc[] = {1, 0};
for (int i = 0; i < 2; i++) {
int next_row = r + dr[i];
int next_col = c + dc[i];
// 如果超出范围,则跳过
if (next_row < 0 || next_row >= rows ||
next_col < 0 || next_col >= cols) continue;
path.push_back({next_row, next_col}); // 记录路径上的点
dfs(next_row, next_col);
path.pop_back(); // 回溯到上一格(将继续选择下一个方向)
}
}
}
int main() {
rows = 5; //行数
cols = 6; //列数
path.push_back({0, 0}); // 起点
dfs(0, 0);
cout << "总共的路径数量: " << counter << endl;
return 0;
}
关注本公众号输入mayimaze可下载本程序源代码及素材与gif动图。
本程序在本人“异编程”微信公众号上有相关文章,网址:https://mp.weixin.qq.com/s/jrLirJd7luDxyeF7uEu_mg

