code: def breadth_first_search(problem):
      "[Fig. 3.11]"
      node = Node(problem.initial)
      if problem.goal_test(node.state):
          return node
      frontier = FIFOQueue()
      frontier.append(node)
      explored = set()
      while frontier:
          node = frontier.pop()
          explored.add(node.state)
          for child in node.expand(problem):
              if child.state not in explored and child not in frontier:
                  if problem.goal_test(child.state):
                      return child
                  frontier.append(child)
      return Nonf breadth_first_search(problem):
      "[Fig. 3.11]"
      node = Node(problem.initial)
      if problem.goal_test(node.state):
          return node
      frontier = FIFOQueue()
      frontier.append(node)
      explored = set()
      while frontier:
          node = frontier.pop()
          explored.add(node.state)
          for child in node.expand(problem):
              if child.state not in explored and child not in frontier:
                  if problem.goal_test(child.state):
                      return child
                  frontier.append(child)
      return None
docs: [Fig. 3.11]