2014-06-10 3 views
0

Я хочу выполнить BFS на дереве, чтобы узнать какой-то лист, но график динамичен по своей природе, когда я приземляюсь на лист, и этот лист не тот, который я ищу, тогда его дети вычисляются из листа (лист больше не является листом, это узел). enter image description hereКак добавить элементы в вектор и пройти его одновременно?

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

int y=0; 
while(graph.end() - graph.begin() < 262145 and graph.end() - graph.begin() < y){ 
     if(found(graph[y])){ 
      clock2 = graph[y]; 
      break; 
     } 
     else{ 
     if(graph[y].b[0] < 4) graph.push_back(move1(graph[y])); 
     if(graph[y].b[1] < 4) graph.push_back(move2(graph[y])); 

    } 
    y++; 
} 

и следующая реализация была что-то вроде этого

for(vector<foo> :: iterator i = graph.begin();i!=graph.end();i++){ 
    if(found(*i)){ 
     clock2 = *i; 
     break; 
    } 
    else{ 
     if(i->b[0] < 4) graph.push_back(move1(*i));//move1 and move2 are 
     if(i->b[1] < 4) graph.push_back(move2(*i));//functions of return type foo 
    } 
} 

Оба они вызывают программа аварии. Что с ними не так, как их реализовать? Прокомментируйте с дополнительными запросами.

+0

возможного дубликат [итераторы правило о недостоверности] (Http: // stackoverflow.com/questions/6438086/iterator-invalidation-rules) – Scis

+0

Вы не можете использовать вектор, так как определенные вставки могут привести к недействительности итераторов, скажем, когда размер превышает емкость. – Coder777

+0

В первом фрагменте это выглядит не так: 'graph.end() - graph.begin() <= y'. – laune

ответ

0

Я немного смущен, что тоже происходит, и что именно вы спрашиваете. Но если вы задаете вопрос о том, как подготовить простой BFS на графике, здесь приведен пример кода примера, который я считаю довольно легко читаемым.

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

struct node{ 
    std::vector children<node*>; 
    int data; 
} 
void bfs(node* root, int value){ // THIS IS CHECK FOR INTS so change for whatever value 
    if(!root) return; 
    std::queue myq; 
    myq.push(root); 
    node* toCheck; 
    while(!myq.Empty()){ 
     toCheck = myq.top(); 
     myq.pop(); 
     if(toCheck->data == value){ 
       //do whatever you want with that information 
     }else{ 
     /* 
      //forloop/whileloop as many times as necessary to set all the new children 
      //Example: 
       node* newNode = new node(); 
       newNode->data = someValue; // just some information that you want to add 
       toCheck->children.push_back(newNode); 
     */ 
     } 
     for(int i = 0; i < toCheck->children.size(); i++){ 
       myq.push(toCheck->children[i]); 
     } 
    } 
} 
+0

Я отредактировал свой вопрос. Посмотрите, сможете ли вы теперь лучше понять –

+0

Подождите, чтобы дерево еще не было сделано? На каких условиях вы решили сделать больше узлов? Сколько узлов? Является ли дерево уже плоским? (уже в векторе)? i.e нет необходимости обрабатывать влево/вправо только через вектор? – Jay

+0

Дерево еще не сделано. Я добавляю больше узлов, когда текущий узел не является узлом, который я ищу. то есть предположим, что я пытаюсь угадать пароль (ради того, чтобы не рисовать много ветвей, давайте рассмотрим это в двоичном виде), я бы сделал это так. Это 0, да? хорошо. Нет? это 1. Да? Хорошо. Нет? Это 00? Да . Хорошо. Нет? Это 01? и, следовательно, ... –

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