2011-01-12 8 views
1
#include <iostream> 
using namespace std; 

#include <list> 


//A queue for the working set 
//x,y co-ords of the square, path length so far 
struct square { 
    int x; 
    int y; 
    int path_length; 
}; 

list<square> workingset; 


//A 2D array of ints to represent the board (duplicates list) 
int board[10][10]; 

void generatelegalmove(square node, int x_offset, int y_offset); 
void printboard(); 

void main() 
{ 
    //Initialises the board 
    int i, j; 
    for (i=0; i<10; i++) 
    { 
     for (j=0; j<10; j++) 
     { 
      board[i][j] = 0; 
     } 
    } 

    //The goal position - a number we will never reach 
    board[8][8] = 1337; 

    bool goal_found = false; 

    //Sets up initial position 
    square temp = {3, 7, 1}; 

    //Put initial position in working set and duplicates list 
    workingset.push_back(temp); 
    board[3][7] = 1; 

    //Loop (until a goal is found) 
    while(!goal_found) 
    { 
     //Get the head node from the working set 
     square nodetocheck = workingset.front(); 

     //Exit if the goal has been found 
     if(board[nodetocheck.x][nodetocheck.y] == 1337) 
     { 
      goal_found = true; 
      break; 
     } 

     //Generate the legal moves 
     generatelegalmove(nodetocheck, -1, 0); //One square to the left 
     generatelegalmove(nodetocheck, 0, -1); //One square up 
     generatelegalmove(nodetocheck, 1, 0); //One square to the right 
     generatelegalmove(nodetocheck, 0, 1); //One square down 


     if(!workingset.empty()) 
     { 
       //workingset.pop_front(); 
     } 

    //End Loop 
    } 

    //Print the Board 
    printboard(); 
    while(true); 

    //Trace back and print Trace back (once implemented) 

    //Print other info 

} 


void generatelegalmove(square node, int x_offset, int y_offset) 
{ 
    node.x = node.x + x_offset; 
    node.y = node.y + y_offset; 
    node.path_length = node.path_length+1; 
    //Is this square on the board 
    if((node.x >= 0) && 
     (node.x < 10) && 
     (node.y >= 0) && 
     (node.y < 10) && 
     //Is this square empty 
     (board[node.x][node.y] == 0)) 
    { 

     workingset.push_back(node); 
     board[node.x][node.y] = node.path_length; 
     //Add to working set 
     //Add to duplicates list 
    } 
    //(If a graphical animation is added, do it here, by printing the new board after each one, then sleeping for a few seconds) 
} 

Я получаю итератор списка ошибок времени выполнения, а не разыменованный.'list iterator not dereferencable'

Я предполагаю, что это связано с workingset.pop_front(), вызываемым из цикла while, но я не уверен, что я должен сделать, чтобы исправить это.

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

Это код для generatelegalmove() - как вы можете видеть, если новый квадрат находится на доске (т. Е. В пределах диапазона 0-9 в обоих измерениях массива, а квадрат пуст), это будет добавьте этот новый узел в рабочий набор и плату [] [] (что фактически является списком дубликатов)

+0

Было бы целесообразно добавить объявление используемой переменной workingset. – harper

+0

Какая конкретная строка кода, который вы отправили, вызывает эту ошибку? Это ошибка компилятора или ошибка времени выполнения (проверка отладки)? –

+0

Что значит? Он добавлен ранее в программе, это список структурного квадрата. Я не добавил весь код, потому что он длинный, и я предполагал такие вещи, как использование include для списка, объявление bool goal_found, инициализирующая плата [] [] и workingset и т. Д., Было бы принято ... Или вы значит что-то еще? – Eilidh

ответ

2

Учитывая образец, который вы предоставили, я вижу, что одно не так. В конце каждой итерации цикла вы добавляете передний узел. Тем не менее, вы только выход из вашего цикла, если goal_found верно, то есть строка:

square nodetocheck = workingset.front(); 

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

EDIT: Я считаю, что ваш код не добавляет другой узел, потому что вы используете оператор bitwise-и & вместо оператора логического и &&, в результате чего ваш рабочий набор не получает узлы.

+0

generatelegalnode() почти всегда будет добавлять узел к набору ... Вы правы, я должен абсолютно разрешить его всплывать, если список не пуст, но я довольно уверен, что он не может * быть пустым, пока не будет найдено состояние цели – Eilidh

+0

(Это представление алгоритма Ли для поиска пути, рабочий набор не должен быть пустым, чтобы попытаться, пока не будет найден квадрат цели, afaik) – Eilidh

+0

вызов front() или pop_front () на пустом множестве будет генерировать ошибку времени выполнения. Пользователь получает ошибку компилятора. – CashCow