Python实现BFS和DFS搜索算法

Python实现BFS和DFS搜索算法

一、题目

如下重排九宫问题:
初 始 状 态 S 0 : 2 8 3 1 4 7 6 5             目 标 状 态 S g : 1 2 3 8 4 7 6 5 初始状态S_0:\begin{matrix}2&8&3\\1&&4\\7&6&5\end{matrix}\ \ \ \ \ \ \ \ \ \ \ 目标状态S_g:\begin{matrix}1&2&3\\8&&4\\7&6&5\end{matrix} S0:21786345           Sg:18726345

二、代码

import numpy as np
import copy

class Node(object):
    def __init__(self,item) -> None:
        self.pre = []
        self.item = item
        self.next = []
        item_temp = np.array(self.item)
        index_0 = np.where(item_temp == 0)
        self.x,self.y = np.dstack((index_0[0], index_0[1])).squeeze()
    
    def CreatNewNode(self):
        
        NewNodeList = []
        for delta_x,delta_y in [[-1,0],[1,0],[0,1],[0,-1]]:
            x = self.x + delta_x
            y = self.y + delta_y
            if x<0 or x>2 or y<0 or y>2:
                continue
            else:
                
                temp = copy.deepcopy(self.item)

                t = temp[x][y]
                temp[x][y] = 0
                temp[self.x][self.y] = t
                NewNodeList.append(temp)
        return NewNodeList
        
        
class TreeStruct(object):
    def __init__(self,RootNode,Target) -> None:
        self.head = RootNode
        self.Target = Target

    
    def CreatTreeStruct(self):
        visited = []
        present = [self.head]
        future = []
        flag = True
        while present and flag:
            for i in present:

                Temp_NewNodeList = i.CreatNewNode()
                for j in Temp_NewNodeList:
                    if j not in visited:
                        temp = Node(j)
                        temp.pre.append(i)
                        future.append(temp)
                        visited.append(j)
                        i.next.append(temp)
                if self.Target in Temp_NewNodeList:
                    flag = False
            present = future
            future = []

            
            
class BFS(object):
    def __init__(self,Target,TreeStruct) -> None:
        self.Target = Target
        self.TreeStruct = TreeStruct
        self.Preresult = []
        self.Finaresult = []
    
    
    def search(self):
        L1 = [self.TreeStruct.head]
        L2 = []
        index = 0
        while True:
            if self.Compare(L1[0]) == True:
                L2.append(L1[0])
                L1.pop(0)
                self.Preresult = L2
                return 1
            else:
                L2.append(L1[0])
                L1.extend(L1[0].next)
                L1.pop(0)

  
    def Compare(self,PresentNode):

        for i in range(3):
            for j in range(3):
                if PresentNode.item[i][j] != self.Target[i][j]:
                    return False
        return True
            
    def PrintResult(self):
        FinaNode = self.Preresult[-1]
        self.Finaresult.insert(0,FinaNode)
        present = FinaNode
        while len(present.pre) == 1:
            present = present.pre[0]
            self.Finaresult.insert(0,present)
        
        for i in range(len(self.Finaresult)):
            for j in range(3):
                print(self.Finaresult[i].item[j][0],self.Finaresult[i].item[j][1],self.Finaresult[i].item[j][2])
            print("——>")
        print("总计步骤:",len(self.Finaresult))
        
        
        
class DFS(object):
    def __init__(self,Target,TreeStruct) -> None:
        self.Target = Target
        self.TreeStruct = TreeStruct
        self.Preresult = []
        self.Finaresult = []
    
    
    def search(self):
        L1 = [self.TreeStruct.head]
        L2 = []
        while True:

            if self.Compare(L1[0]) == True:
                L2.append(L1[0])
                L1.pop(0)
                self.Preresult = L2
                return 1
            else:
                L2.append(L1[0])
                temp = copy.deepcopy(L1[0].next)
                L1.pop(0)
                temp.extend(L1)
                L1 = copy.deepcopy(temp)
                del temp
                
                
                
    def Compare(self,PresentNode):

        for i in range(3):
            for j in range(3):
                if PresentNode.item[i][j] != self.Target[i][j]:
                    return False
        return True
            
    def PrintResult(self):
        FinaNode = self.Preresult[-1]
        self.Finaresult.insert(0,FinaNode)
        present = FinaNode
        while len(present.pre) == 1:
            present = present.pre[0]
            self.Finaresult.insert(0,present)
        
        for i in range(len(self.Finaresult)):
            for j in range(3):
                print(self.Finaresult[i].item[j][0],self.Finaresult[i].item[j][1],self.Finaresult[i].item[j][2])
            print("——>")
        print("总计步骤:",len(self.Finaresult))
        
            
            
if __name__ == "__main__":
    Root = [[2,8,3],[1,0,4],[7,6,5]]
    Target = [[1,2,3],[8,0,4],[7,6,5]]
    RootNode = Node(Root)
    Tree = TreeStruct(RootNode,Target)
    Tree.CreatTreeStruct()
    print("广度优先搜索:")
    BFS = BFS(Target,Tree)
    BFS.search()
    BFS.PrintResult()
    print("深度优先搜索:")
    DFS = DFS(Target,Tree)
    DFS.search()
    DFS.PrintResult()
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

RivenRussell

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值