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. Android DataBinding使用详解

    简介 DataBinding是一个自动绑定UI的框架. 使用DataBinding需要在app根目录的build.gradle文件中加入DataBinding配置: android { .... da ...

  2. ELK 脚本自动化删除索引

    kibana有自带接口,可通过自带的API接口 通过传参来达到删除索引的目的. # 删除15天前的索引 curl -XDELETE "http://10.228.81.161:9201/pa ...

  3. DeWeb发展历程! 从2015年开始

    有位朋友问: [高中]长兴(667499XX) 2021-01-15 15:52:11 deweb会长期做吗 我查了一下,发现deweb最早从2015开始,算起来已经做了5~6年了,目前已日臻成熟!

  4. Filter学习笔记

    博客园的编辑器太丑了,所以我换用了别的Markdown编辑器,并用图片形式上传.

  5. Linux常用命令和快捷键整理:(1)常用命令

    前言: Linux常用快捷键和基本命令整理,先上思维导图: 1.ls命令 就是list的缩写,通过ls 命令不仅可以查看linux文件夹包含的文件,而且可以查看文件权限(包括目录.文件夹.文件权限) ...

  6. JMeter学习笔记--关联

    1.什么是关联? 本次请求需要的数据,需要上一步的请求返回给提供的过程. 2.JMeter关联中常用的两种方式 正则表达式提取器 正则表达式提取器用于对页面任何文本的提取,提取的内容是根据正则表达式在 ...

  7. css书写规范 & 页面布局规范 &常用案例经验总结

    CSS 属性书写顺序(重点) 建议遵循以下顺序: 布局定位属性:display / position / float / clear / visibility / overflow(建议 displa ...

  8. fabric运行记录

    创建第一个fabric网络 Generate Network Artifacts cd first-network 先关闭服务 ./byfn.sh -m down 然后创建 ./byfn.sh -m ...

  9. python unicode escape

    from: https://stackoverflow.com/questions/44742806/how-to-remove-escape-characters-escaping-unicode- ...

  10. MyCat读写分离+MySql主从(一主一从)

    数据库一直在项目担当着一位核心的角色,是所有项目结构中的底层,说白了,我们程序员进行项目开发都是在和数据打交道,而数据都是保存在数据库中,如mysql.oracle.postgresql等等,如果一个 ...