BFS求解N数码(python)

用python来写可以简单语法的问题,将精力集中到算法.

[1]其他要点都和A*算法里面一样,只是求解8数码的版本用的是传统BFS,求解16数码的时候因为太大了,所以用了dict进行hash查重.同时这里是用的康托展开来压缩状态。

import os
import time
N = 9
T = [1,2,3,4,5,6,7,8,0]#the original state
obj = [2,4,3,1,6,0,7,5,8]#the final state
factory = [1, 1, 2, 6, 24, 120,720, 5040,40320]
def formed_print(L):
    n = 0;
    for i in range(0,7,3):
        t = L[i:i+3]
        print(t[0],t[1],t[2])
    print('\n')

def get_state(node):
    used,sum = [0]*9,0
    for pos,i in enumerate(node):
        num = 0
        used[i] = 1
        for k in range(0,i):
            if(used[k]==0):num += 1
        sum += num*factory[8-pos]
    return sum

def find_next_nodes(curr_node):
    def swap(L,i,j):#return a list with swapped items
        temp = L[::]
        temp[i],temp[j] = temp[j],temp[i]
        return temp
    pos = curr_node.index(0)#find the position of 0
    i,j = pos//3,pos%3
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值