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写的推箱子搜索程序的更多相关文章

  1. 每个人都可以用C语言写的推箱子小游戏!今天你就可以写出属于自己项目~

    C语言,作为大多数人的第一门编程语言,重要性不言而喻,很多编程习惯,逻辑方式在此时就已经形成了.这个是我在大一学习 C语言 后写的推箱子小游戏,自己的逻辑能力得到了提升,在这里同大家分享这个推箱子小游 ...

  2. Python写一个自动点餐程序

    Python写一个自动点餐程序 为什么要写这个 公司现在用meican作为点餐渠道,每天规定的时间是早7:00-9:40点餐,有时候我经常容易忘记,或者是在地铁/公交上没办法点餐,所以总是没饭吃,只有 ...

  3. 如何用 Python 写一个简易的抽奖程序

    不知道有多少人是被这个头图骗进来的:) 事情的起因是这样的,上周有同学问小编,看着小编的示例代码敲代码,感觉自己也会写了,如果不看的话,七七八八可能也写的出来,但是一旦自己独立写一段程序,感觉到无从下 ...

  4. 用 python 写一个年会抽奖小程序

    使用 pyinstaller 打包工具常用参数指南 pyinstaller -F demo.py 参数 含义 -F 指定打包后只生成一个exe格式的文件 -D –onedir 创建一个目录,包含exe ...

  5. 用python写个简单的小程序,编译成exe跑在win10上

    每天的工作其实很无聊,早知道应该去IT公司闯荡的.最近的工作内容是每逢一个整点,从早7点到晚11点,去查一次客流数据,整理到表格中,上交给素未蒙面的上线,由他呈交领导查阅. 人的精力毕竟是有限的,所以 ...

  6. Python写ROS 订阅与发布程序

    1. 编写talker代码 vim ..../src/talker.py #!/usr/bin/env python # license removed for brevity import rosp ...

  7. Python练习册 第 0013 题: 用 Python 写一个爬图片的程序,爬 这个链接里的日本妹子图片 :-),(http://tieba.baidu.com/p/2166231880)

    这道题是一道爬虫练习题,需要爬链接http://tieba.baidu.com/p/2166231880里的所有妹子图片,点进链接看一下,这位妹子是日本著名性感女演员--杉本由美,^_^好漂亮啊,赶紧 ...

  8. 使用python写的一个代码统计程序

    # encoding="utf-8" """ 统计代码行数 """ import sys import os def c ...

  9. C语言之推箱子游戏代码

    前言本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理.作者:Yan_Less 正文 新手注意:如果你学习遇到问题找不到人解答,可以点 ...

随机推荐

  1. Vulnhub实战-dr4g0n b4ll靶机👻

    Vulnhub实战-dr4g0n b4ll靶机 地址:http://www.vulnhub.com/entry/dr4g0n-b4ll-1,646/ 描述:这篇其实没有什么新奇的技巧,用到的提权方式就 ...

  2. 力扣 - 剑指 Offer 58 - I. 翻转单词顺序

    题目 剑指 Offer 58 - I. 翻转单词顺序 思路1 假如题目要求我们翻转字符串,那么我们可以从末尾往前开始遍历每一个字符,同时将每一个字符添加到临时空间,最后输出临时空间的数据就完成翻转了, ...

  3. Dubbo框架协议总结

    Dubbo支持的各种协议及相关特性及应用场景,均可在官网文档中找到. 支持的协议有dubbo.rmi.hession.http.webservice.thrift.memcached.redis.re ...

  4. [转]技术往事:改变世界的TCP/IP协议

    原文链接 : http://www.52im.net/thread-520-1-1.html 1.前言 作为应用层开发人员,接触最多的网络协议通常都是传输层的TCP(与之同处一层的另一个重要协议是UD ...

  5. jmeter no-JUI执行常用命令(四)

    一.常用命令简述 -n, --nongui命令行界面启动jmeter-t, --testfile {filename}jmx结尾的测试计划,支持相对路径-l, --logfile {filename} ...

  6. Sentinel-Go 源码系列(二)|初始化流程和责任链设计模式

    上节中我们知道了 Sentinel-Go 大概能做什么事情,最简单的例子如何跑起来 其实我早就写好了本系列的第二篇,但迟迟没有发布,感觉光初始化流程显得有些单一,于是又补充了责任链模式,二合一,内容显 ...

  7. OpenXml SDK学习笔记(1):Word的基本结构

    能写多少篇我就不确定了,可能就这一篇就太监了,也有可能会写不少. OpenXml SDK 相信很多人都不陌生,这个就是管Office一家的文档格式,Word, Excel, PowerPoint等都用 ...

  8. redis学习笔记(详细)——高级篇

    redis学习笔记(详细)--初级篇 redis学习笔记(详细)--高级篇 redis配置文件介绍 linux环境下配置大于编程 redis 的配置文件位于 Redis 安装目录下,文件名为 redi ...

  9. MQ限流应用

    业务背景:系统中需要发送邮件给用户!实现是javamail发送 问题:某天,发现有些用户并未收到邮件排查: 1,登录发件箱,发现如下图:大量邮件发送失败,大部分是发送频率过高导致邮箱外发功能被限制 3 ...

  10. 第五周PTA笔记 后缀表达式+后缀表达式计算

    后缀表达式 所谓后缀表达式是指这样的一个表达式:式中不再引用括号,运算符号放在两个运算对象之后,所有计算按运算符号出现的顺序,严格地由左而右进行(不用考虑运算符的优先级). 如:中缀表达式 3(5–2 ...