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. PCIE基本知识

    转载:https://zhuanlan.zhihu.com/p/139656925 前言 之前主要都在做FPGA算法层面的东西,最近觉得对于接口方面的知识比较欠缺,打算以PCI-E为例来系统的学习一下 ...

  2. 理解ASP.NET Core - 文件服务器(File Server)

    注:本文隶属于<理解ASP.NET Core>系列文章,请查看置顶博客或点击此处查看全文目录 提供静态文件 静态文件默认存放在 Web根目录(Web Root) 中,路径为 项目根目录(C ...

  3. java实现rsa加密算法【5min快速应用教程】

    该篇文章的主要目的是让读者能够迅速应用到项目中,想要了解详细的rsa加密算法的,可以百度找到更多原理.深度分析的文章. RSA算法是一种非对称密码算法,所谓非对称,就是指该算法需要一对密钥,使用其中一 ...

  4. Notepad++ 过滤注释行和空行

    Notepad++ 删除指定字符开头的行的正则表达式 1.删除A之后的所有字符用:A.*$ 2.删除A之前的所有字符用:^([^s]*)A ####如果是其他字符就把A替换为其他字符 注释:如何是特殊 ...

  5. CentOS7自动备份oracle数据库

    1.环境 操作系统:CentOS 7 数据库:11.2.0.1.0 2.登录服务器 切换oracle用户,备份需要在oracle用户下进行 #su - oracle 在oracle家目录下创建bin目 ...

  6. VMware vSphere中三种磁盘:精简置备/厚置备置零/厚置备延迟置零

    VMware磁盘格式分类. 厚置备延迟置零.厚置备置零和精简置备1.厚置备延迟置零(zeroed thick) 以默认的厚格式创建虚拟磁盘.创建过程中为虚拟磁盘分配所需空间.创建时不会擦除物理设备上保 ...

  7. LeetCode 113. 路径总和 II C++

    提交结果:内存超100%,用时超69% /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNo ...

  8. Centos8上安装Mysql8.X

    一.下载Mysql 下载地址:https://dev.mysql.com/downloads/mysql/ 二.将压缩包通过ftp软件服务器的目标位置:并解压 1.我的是放在:/root/softwa ...

  9. ant生成jmeter测试报告没有数据【已解决】

    1.如下图,在配置build时,到网上找配置文件,配置样式表文件名经常是jmeter-results-detail-report_21.xsl, 3.但是在其他版本可能被不是这个文件名,在jmeter ...

  10. python -m参数

    把模块当做脚本运行,标准库和第三方库都可以 会把当前路径添加到sys.path中