西湖论剑-Reverse-Cellular
做法1
好久没更新博客了,我开始了。
这是一个蜂窝寻路题,下面这个函数在根据map的字符串数组构建地图。
地图如下
然后输入L,R进行路劲探索,R是逆时针,L是顺时针,如果下一步是之前走过的就停下,如果下一步是’+’号直接挂掉。需要遍历所有’-‘号,从’*’到’#’。代表性实现部分如下:其实就是判断目前所在方位然后决定顺时针/逆时针的方向路线(在题目中一个节点有2,3,4三个方向可以走)。
最后走出来就是答案,路线如下:
做法2
acd的做法…直接把程序patch了来dfs。patch成只要路能走完,不碰到’+’就成功。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| import subprocess
length=25 route=''
def dfs_fake(route): p=subprocess.Popen("Cellular.exe", stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True) out,err=p.communicate(route + "\r\n") data=out print data p.terminate() if 'Wrong~' in data or len(data)==0: return False else: return True def dfs_real(route): p=subprocess.Popen("Cellular_real.exe", stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True) out,err=p.communicate(route+'\r\n') data=out p.terminate() if 'Wrong~' in data or len(data)==0: return False else: return True def bruteforce(route): print route if dfs_fake(route): if dfs_real(route): print 'get flag' exit(0) if (len(route)>length): return else: bruteforce(route+'L') bruteforce(route+'R') else: return def main(): bruteforce('R') if __name__=='__main__': main()
|