2013-05-04 3 views
5

Я новичок в Java, и мне нужна помощь.Реализация BFS в Java

Я пытаюсь реализовать алгоритм Breadth First Search для решения головоломки (разблокируйте игру на Android). Я закончил с GUI, но я застрял в алгоритме.

До сих пор я могу подсчитать доступные ходы каждого блока, которые должны быть дочерними узлами корневого узла. Каждый узел (связанный список) имеет положение каждого блока, и все узлы хранятся в наборе.

Теперь мне нужно отметить каждый узел как посещенный, поэтому я не попадаю в цикл.

Буду признателен за любую помощь, и, пожалуйста, исправьте меня, если я ошибаюсь ни с чем.

Заранее спасибо :)

ответ

6
public void bfs() 
{ 
    // BFS uses Queue data structure 
    Queue queue = new LinkedList(); 
    queue.add(this.rootNode); 
    printNode(this.rootNode); 
    rootNode.visited = true; 
    while(!queue.isEmpty()) { 
     Node node = (Node)queue.remove(); 
     Node child=null; 
     while((child=getUnvisitedChildNode(node))!=null) { 
      child.visited=true; 
      printNode(child); 
      queue.add(child); 
     } 
    } 
    // Clear visited property of nodes 
    clearNodes(); 
} 

Это пример ширины первого поиска в Java, если вы дать некоторый код, который мы можем помочь адаптировать его к вашему

+1

Если вы используете интерфейс Deque в связанном списке, вы можете легко изменить, что BFS также является DFS (при необходимости). http://docs.oracle.com/javase/7/docs/api/java/util/Deque.html –

+1

где определены методы 'printNode()' и 'visited()'? Как я могу подражать «посещению»? – Growler

3
public static void bfs(BinaryTree.Node<Integer> root) 
{ 
    BinaryTree.Node<Integer> temp; //a binary tree with a inner generic node class 
    Queue<BinaryTree.Node<Integer>> queue = new LinkedList<>(); //can't instantiate a Queue since abstract, so use LLQueue 
    if (root == null) 
    { 
     return; 
    } 
    queue.add(root); 
    while (!queue.isEmpty()) 
    { 
     temp = queue.poll(); //remove the node from the queue 
     //process current node 
     System.out.println(temp.data); 
     //process the left child first 
     if (temp.left != null) 
     { 
      queue.add(temp.left); 
     } 
     //process the right child after the left if not null 
     if (temp.right != null) 
     { 
      queue.add(temp.right); 
     } 
    } 
} 
1

@Growler I не смог прокомментировать ссылку aaronman (недостаточно rep), но посещенное поле является публичным членом поля в классе Node.

public class Node{ 
    public boolean visited; 
    public Object data; 
    //other fields 

     public Node(Object data){ 
      this.visited = false; 
      this.data = data; 
     } 
} 

Как для печати Node, я полагаю, aaronman просто передавая объект узла к способу печати, и это просто отображать любые данные класса Node может содержать

public void print(Node node){ 
    System.out.println(node.data); 
} 
1

Пожалуйста, попробуйте следующее:

import java.util.ArrayList; 
import java.util.List; 

public class TreeTraverse { 

    static class Node{ 
     Node(int data){ 
      this.data = data; 
      this.left = null; 
      this.right = null; 
      this.visited = false; 
     } 
     int data; 
     Node left; 
     Node right; 
     boolean visited; 
    } 

    public static void main(String[] args) { 
     //The tree: 
     // 1 
     ///\ 
     // 7 9 
     // \/\ 
     // 8 2 3 

     Node node1 = new Node(1); 
     Node node7 = new Node(7); 
     Node node9 = new Node(9); 
     Node node8 = new Node(8); 
     Node node2 = new Node(2); 
     Node node3 = new Node(3); 
     node1.left = node7; 
     node1.right = node9; 
     node7.right = node8; 
     node9.right = node3; 
     node9.left = node2; 
     System.out.println("BFS: "); 
     breadthFirstSearch(node1); 

    } 

    private static void breadthFirstSearch(Node node){ 
     List<Node> al = new ArrayList<>(); 
     al.add(node); 
     while(!al.isEmpty()){ 
      node = al.get(0); 
      if(node.left != null){ 
       int index = al.size(); 
       al.add(index,node.left); 
      } 
      if(node.right != null){ 
       int index = al.size(); 
       al.add(index,node.right); 
      } 
      System.out.print(al.get(0).data+" "); 
      al.remove(0); 


     } 
    } 

} 

Для получения дополнительной информации, пожалуйста, посетите: https://github.com/m-vahidalizadeh/foundations/blob/master/src/algorithms/TreeTraverse.java.

Смежные вопросы