用python写的推箱子搜索程序
1 # -*- coding: gbk -*-
2 from functools import reduce
3 from copy import deepcopy
4 import re
5 def s(l): return reduce(lambda x,y:x+y, l, '')
6 class Brd:
7 def __init__(m, s):
8 m.x = m.y = -1; m.b = []
9 b = [x for x in re.split('[\r|\n]', s.upper()) if x != '']
10 for y in range(len(b)):
11 x = b[y].find('?')
12 if x != -1: (m.x, m.y) = (x, y)
13 m.b.append(list(b[y]))
14 def __str__(m): return reduce(lambda x,y:s(x)+'\n'+s(y), m.b, '')
15 def equal(m, bstr):
16 m.b[m.y][m.x] = '.'; eq = str(m) == bstr; m.b[m.y][m.x] = '?'
17 return eq
18 start = Brd('''
19 WWWWWW
20 W....W
21 WWWBBB.W
22 W?.B...W
23 W.B...WW
24 WWWW..W
25 WWWW
26 ''')
27 start = Brd('''
28 WWWWWW
29 W....W
30 WWW..B.W
31 W..B...W
32 W?.BBBWW
33 WWWW..W
34 WWWW
35 ''')
36 target = str(Brd('''
37 WWWWWW
38 W....W
39 WWW....W
40 W...BB.W
41 W..BBBWW
42 WWWW..W
43 WWWW
44 '''))
45 tried = {}
46 def step(b, dx, dy):
47 if b.b[b.y+dy][b.x+dx] == 'W': return None
48 b = deepcopy(b); c = b.b; x = b.x; y = b.y
49 if c[y+dy][x+dx] == '.':
50 (c[y+dy][x+dx], c[y][x]) = ('?', '.')
51 (b.x, b.y) = (x+dx, y+dy)
52 return b
53 x2=dx*2; y2=dy*2 # 2*(dx,dy) = (dx,dy,dx,dy)
54 if c[y+y2][x+x2] == '.':
55 (c[y+y2][x+x2], c[y+dy][x+dx], c[y][x]) = ('B', '?', '.')
56 (b.x, b.y) = (x+dx, y+dy)
57 return b
58 return None
59 def search(brd, path):
60 if brd.equal(target):
61 for p in path: print(p)
62 return True
63 s = str(brd)
64 if tried.get(s, False): return False
65 tried[s] = True
66 for (dx, dy) in [[-1,0],[1,0],[0,-1],[0,1]]:
67 t = step(brd, dx, dy)
68 if t == None: continue
69 if search(t, path+[t]): return True
70 return False
71 search(start, [start])
能用但贼慢。

试了下path不是search的参数,而是append和pop, 没有变快。这说明python在栈上传递临时变量做得很好。应记录旧的(x, y)再恢复,而不是deepcopy(board).However, 可以用来测语言的deepcopy快不快。:-)
用python写的推箱子搜索程序的更多相关文章
- 每个人都可以用C语言写的推箱子小游戏!今天你就可以写出属于自己项目~
C语言,作为大多数人的第一门编程语言,重要性不言而喻,很多编程习惯,逻辑方式在此时就已经形成了.这个是我在大一学习 C语言 后写的推箱子小游戏,自己的逻辑能力得到了提升,在这里同大家分享这个推箱子小游 ...
- Python写一个自动点餐程序
Python写一个自动点餐程序 为什么要写这个 公司现在用meican作为点餐渠道,每天规定的时间是早7:00-9:40点餐,有时候我经常容易忘记,或者是在地铁/公交上没办法点餐,所以总是没饭吃,只有 ...
- 如何用 Python 写一个简易的抽奖程序
不知道有多少人是被这个头图骗进来的:) 事情的起因是这样的,上周有同学问小编,看着小编的示例代码敲代码,感觉自己也会写了,如果不看的话,七七八八可能也写的出来,但是一旦自己独立写一段程序,感觉到无从下 ...
- 用 python 写一个年会抽奖小程序
使用 pyinstaller 打包工具常用参数指南 pyinstaller -F demo.py 参数 含义 -F 指定打包后只生成一个exe格式的文件 -D –onedir 创建一个目录,包含exe ...
- 用python写个简单的小程序,编译成exe跑在win10上
每天的工作其实很无聊,早知道应该去IT公司闯荡的.最近的工作内容是每逢一个整点,从早7点到晚11点,去查一次客流数据,整理到表格中,上交给素未蒙面的上线,由他呈交领导查阅. 人的精力毕竟是有限的,所以 ...
- Python写ROS 订阅与发布程序
1. 编写talker代码 vim ..../src/talker.py #!/usr/bin/env python # license removed for brevity import rosp ...
- Python练习册 第 0013 题: 用 Python 写一个爬图片的程序,爬 这个链接里的日本妹子图片 :-),(http://tieba.baidu.com/p/2166231880)
这道题是一道爬虫练习题,需要爬链接http://tieba.baidu.com/p/2166231880里的所有妹子图片,点进链接看一下,这位妹子是日本著名性感女演员--杉本由美,^_^好漂亮啊,赶紧 ...
- 使用python写的一个代码统计程序
# encoding="utf-8" """ 统计代码行数 """ import sys import os def c ...
- C语言之推箱子游戏代码
前言本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理.作者:Yan_Less 正文 新手注意:如果你学习遇到问题找不到人解答,可以点 ...
随机推荐
- cf14C Four Segments(计算几何)
题意: 给四个线段(两个端点的坐标). 判断这四个线段能否构成一个矩形.(矩形的四条边都平行于X轴或Y轴) 思路: 计算几何 代码: class Point{ public: int x,y; voi ...
- MarkdownPad2弹窗显示HTML Rendering Error(HTML 渲染错误)的解决办法
MarkdownPad2弹窗显示HTML Rendering Error(HTML 渲染错误)的解决办法 我在打开.md文件的时候,出现以下错误: 解决方式:下载Awesomium SDK并安装,重启 ...
- dotnet 6 使用 CreateSymbolicLink 创建文件夹符号链接
本文告诉大家如何使用 dotnet 6 提供的 Directory.CreateSymbolicLink 和 File.CreateSymbolicLink 方法创建文件夹和文件的符号链接 Direc ...
- 四. 几个Promise常用API的介绍与使用
四. 几个常用API的介绍与使用 1. Promise构造函数:Promise(excutor){} excutor函数:同步执行 (resolve, reject) => {} resolve ...
- C# 获取PDF中的数字签名证书
PDF中的加数字签名是对文档权威性的有效证明.我们在向PDF文档添加签名时,需要准备可信任的签名证书.同时,对已有的签名,可验证签名是否有效,也可以获取文档中的签名证书信息.下面,以C#代码示例展示如 ...
- 基于Netty实现自定义消息通信协议(协议设计及解析应用实战)
所谓的协议,是由语法.语义.时序这三个要素组成的一种规范,通信双方按照该协议规范来实现网络数据传输,这样通信双方才能实现数据正常通信和解析. 由于不同的中间件在功能方面有一定差异,所以其实应该是没有一 ...
- 站长管理服务器必读:Ftp、Ftps与Sftp三兄弟的不同与区别以及部署全指引
文章标题: 站长管理服务器必读:Ftp.Ftps与Sftp三兄弟的不同与区别以及部署全指引 关键字 : ftp,sftp,freesshd,ftps 文章分类: 教程 创建时间: 2020年3月23日 ...
- python递归三战:Sierpinski Triangle、Tower of Hanoi、Maze Exploring
本文已做成视频教程投稿b站(视频版相对文本版有一些改进),点击观看视频教程 本文主要通过三个实例来帮助大家理解递归(其展示动画已上传B站): 谢尔宾斯基三角形(Sierpinski Triangle) ...
- Python 练习 进程
... """ 创建2个进程, 每一个进程都打出当前的时间和进程的标识,持续打十次. """ import multiprocessing ...
- C#中指针的使用(转)
在C#中,有时候希望通过指针来操作内存,这样可以提高效率.我们可以用unsafe关键字修饰含有指针操作的程序段,如下所示: class Program { static int Main(stri ...