Breadth First Search вопрос C ++ - PullRequest
       19

Breadth First Search вопрос C ++

3 голосов
/ 09 августа 2011

Это мой первый раз, когда я программирую на C ++, и меня попросили закодировать поиск в ширину, где указан этот класс

class route {

  friend ostream& operator<<(ostream& os, const route& p);

 public:

  route(const string& startPlayer);
  int getLength() const { return links.size(); };
  void addConnect(const sport& s, const string& player);
  void removeConnect();
  const string& getLastPlayer() const;

 private:

  struct Connect {
    sport s;
    string player;
    Connect() {}
    Connect(const sport& s, const string& player) : s(s), player(player) {}
  };

  string startPlayer;
  vector<Connect> links;
};

sport - это структура, состоящая из string name и int players. Может ли кто-нибудь объяснить мне, как я буду делать BFS?

Заранее спасибо!

РЕДАКТИРОВАТЬ:

Я понимаю алгоритм для BFS, но, поскольку я когда-либо программировал только C, понимание ОО-программирования довольно запутанно для меня, учитывая тот интерфейс, с которого я начинаю с этой BFS, я делаю новую функцию, которая делает Сравнение BFS, start string с target string

namespace {

string promptForSPlayer(const string& prompt, const spdb& db)
{
  string response;
  while (true) {
    cout << prompt << " [or <enter> to quit]: ";
    getline(cin, response);
    if (response == "") return "";
    vector<sport> splist;
    if (db.getsplist(response, splist)) return response;
    cout << "It's not here: \"" << response << "\" in the sports database. "
     << "Please try again." << endl;
  }
}

}

int main(int argc, char *argv[])
{
  if (argc != 2) {
    cerr << "Usage: sports" << endl;
    return 1;
  }

  spdb db(argv[1]);

  if (!db.good()) {
    cout << "Failed to properly initialize the spdb database." << endl;
    cout << "Please check to make sure the start files exist and that you have permission to read them." << endl;
    exit(1);
  }

  while (true) {
    string start = promptForSplayer("Player", db);
    if (start == "") break;
    string target = promptForSplayer("Another Player", db);
    if (target == "") break;
    if (start == target) {
      cout << "Good one.  This is only interesting if you specify two different people." << endl;
    } else {
      // replace the following line by a call to your generateShortestPath routine... 
      cout << endl << "No path between those two people could be found." << endl << endl;
    }
  }
  return 0;
}

Ответы [ 2 ]

4 голосов
/ 09 августа 2011

Ширина Первый поиск - это 2 вопроса

  1. В каком я состоянии сейчас?
  2. В какие состояния я могу попасть отсюда?

Идея состоит в том, чтобы иметь начальное состояние и постоянно задавать себе эти 2 вопроса, пока

  1. Больше не останется состояний.
  2. Я достиг состояния назначения.

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

0 голосов
/ 09 августа 2011

Класс маршрута - это всего лишь механизм для хранения маршрутов, которые вы найдете с помощью BFS. По крайней мере, так я это интерпретирую. Алгоритм BFS будет автономной функцией, которая будет вызывать методы класса маршрута в подходящее время. Поскольку BFS необходимо хранить информацию о нескольких маршрутах, она должна создавать несколько объектов маршрутов в каком-либо списке или очереди. Каждый шаг BFS будет брать один объект маршрута из очереди, копировать его и вызывать на нем addConnect для перемещения в следующее место, а затем помещать его обратно в очередь. Повторяйте, пока не доберетесь до пункта назначения, затем верните объект маршрута, представляющий кратчайший путь из вашей функции BFS.

Как-то так.

...