用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])

能用但贼慢。

用python写的推箱子搜索程序

 

上一篇:题目 1009: [编程入门]数字的处理与判断 java


下一篇:黑马程序员+Winform基础(上)