用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 正文 新手注意:如果你学习遇到问题找不到人解答,可以点 ...
随机推荐
- DDD领域驱动设计-设计规范-Ⅵ
不以规矩,不能成方圆. -战国·邹·孟轲<孟子·离娄章句上 ...
- Spring Cloud 微服务实战——nacos 服务注册中心搭建(附源码)
作为微服务的基础功能之一的注册中心担任重要的角色.微服务将单体的服务拆分成不同的模块下的服务,而不同的模块的服务如果进行通信调用呢?这就需要服务注册与发现.本文将使用阿里开源项目 nacos 搭建服务 ...
- jQuery淡入淡出效果
如果是通过鼠标点击事件来触发动画效果可以使用 $("#button").click(function(){ $("#div").stop().fadeToggl ...
- 1.在项目中使用D3.js
在项目中使用D3.js D3.js(全称:Data-Driven Documents)是一个基于数据操作文档的JavaScript库.D3帮助您使用HTML.SVG和CSS使数据生动起来.D3对web ...
- 一个开源的C#和cefsharp项目:逐浪字体大师pc版上线(附源码开源)
z01逐浪字体大师,是一款基于C#和web引擎开发的字体设计软件,可以打开直接写字,也可以链接官方资源 ,附Github开源库,欢迎大家下载.客户端技术是基于wpf设计的,整个界面精美,与逐浪CMS技 ...
- Linux服务——二、配置NFS及autofs自动挂载服务
一.NFS服务配置步骤 NFS的作用:能够使两台虚拟机之间实现文件共享.数据同步 准备:主机名.网络.yum源 Server端: 1.安装nfs-util和rpcbind:(图形化自带) [root@ ...
- QuantumTunnel:v1.0.0 正式版本发布
经过一段时间运行,代码已经稳定是时候发布正式版本了! v1.0.0 正式版本发布 对核心能力的简要说明: 支持协议路由和端口路由:QuantumTunnel:端口路由 vs 协议路由 基于Netty实 ...
- 如何正确的找BUG
什么是BUG 漏洞是在硬件.软件.协议的具体实现或系统安全策略上存在的缺陷,从而可以使攻击者能够在未授权的情况下访问或破坏系统.具体举例来说,比如在Intel Pentium芯片中存在的逻辑错误,在S ...
- [hdu7042]二叉树
考虑最后这棵二叉树的结构,不难发现被移动的点在原树或新树中构成的都是若干棵完整的子树 (若$x$被移动,则$x$在原树或新树的子树中所有点都会被移动) 先在原树中考虑此问题,对于每一棵由被移动的点所构 ...
- [hdu7074]Little prince and the garden of roses
显然每种颜色的花是独立的,可以分别求出答案后取$\max$ 对于某种颜色$C$,建立一张二分图,左右分别为$n$行$n$列,且第$i$行和第$j$列有边当且仅当$c_{i,j}=C$ 此时,问题即对边 ...