Лабиринт
От: C0nsul  
Дата: 31.05.05 18:05
Оценка:
Сетью наз-ся совокупность точек (узлов), некоторые соединены м/у собой стрелками. Сети, состоящей из N узлов можно сопоставить 2 квадратные матрицы порядка N: матрицу соединений и матрицу связей. Элемент матрицы соед-ий Aij равен 1, если сеть содержит стрелку, ведущую из узла I в узел j , и 0 в противном случае. Элемент Bij матрицы связей равен 1, если из узла i можно попасть в узел j двигаясь по стрелкам, и 0 в противном случае.
Лабиринт может быть задан матрицей соединений, в кот-ой для каждой пары комнат указано, соединены ли они коридором. Даны матрица соединений из для лабиринта из N комнат и номера комнат 1<=i<=N, 1<=j<=N. Построить путь из комнаты i в комнату j.
Re: Лабиринт
От: _DAle_ Беларусь  
Дата: 31.05.05 18:12
Оценка:
Здравствуйте, C0nsul, Вы писали:

C>Сетью наз-ся совокупность точек (узлов), некоторые соединены м/у собой стрелками. Сети, состоящей из N узлов можно сопоставить 2 квадратные матрицы порядка N: матрицу соединений и матрицу связей. Элемент матрицы соед-ий Aij равен 1, если сеть содержит стрелку, ведущую из узла I в узел j , и 0 в противном случае. Элемент Bij матрицы связей равен 1, если из узла i можно попасть в узел j двигаясь по стрелкам, и 0 в противном случае.

C>Лабиринт может быть задан матрицей соединений, в кот-ой для каждой пары комнат указано, соединены ли они коридором. Даны матрица соединений из для лабиринта из N комнат и номера комнат 1<=i<=N, 1<=j<=N. Построить путь из комнаты i в комнату j.

http://en.wikipedia.org/wiki/Breadth-first_search
Re[2]: Лабиринт
От: C0nsul  
Дата: 07.06.05 08:35
Оценка:
Здравствуйте, _DAle_, Вы писали:

_DA>Здравствуйте, C0nsul, Вы писали:


C>>Сетью наз-ся совокупность точек (узлов), некоторые соединены м/у собой стрелками. Сети, состоящей из N узлов можно сопоставить 2 квадратные матрицы порядка N: матрицу соединений и матрицу связей. Элемент матрицы соед-ий Aij равен 1, если сеть содержит стрелку, ведущую из узла I в узел j , и 0 в противном случае. Элемент Bij матрицы связей равен 1, если из узла i можно попасть в узел j двигаясь по стрелкам, и 0 в противном случае.

C>>Лабиринт может быть задан матрицей соединений, в кот-ой для каждой пары комнат указано, соединены ли они коридором. Даны матрица соединений из для лабиринта из N комнат и номера комнат 1<=i<=N, 1<=j<=N. Построить путь из комнаты i в комнату j.

_DA>http://en.wikipedia.org/wiki/Breadth-first_search


Спасибо за помощь, смысл я понял. Но вот проблема — как распечатать на экране весь пройденный путь из I в J?

Вот текст моей проги:

#include <windows>
#include <iostream>
#include <fstream>
#include <conio>

class Stack
{
   public:
           Stack() : top(0) {}
           int a[1000];
           int top;
           bool empty();
           int pop();
           void push(int x);
           void print();
};

bool Stack :: empty()
{
   return ( ( !top ) ? (true) : (false) );
}

int Stack :: pop()
{
   return a[--top];
}

void Stack :: push(int x)
{
   a[top++] = x;
}

void Stack :: print()
{
   for(int i=0; i<top; ++i)
      cout << "\n Stack:  " << a[i] << ' ';
   cout << endl;
}

// GLOBAL
const N = 10;
int matrix[N][N];
Stack Queue;

void breadthSearch(int size, int Start, int Goal)
{
     int Node;
     Queue.push(Start);
     while( !Queue.empty() )
     {
          Node = Queue.pop();
          cout << Node+1 << '\n';          
          if( Node == Goal )
          {
              return;
          }
          for(int j=0; j<size; ++j)
          {
              if( matrix[Node][j] )
              {
                 Queue.push(j);
                 matrix[Node][j] = 0;
              }
          }
     }
}

int main()
{
    int i, j, I, J, size;

    // считываем matrix из файла
    ifstream ifile("labirint.txt");
    ifile >> size;
    if ( (size < 2) || (size > N) )
    {
       cout << " Size of Matrix is Bad!";
       ifile.close();
       exit(0);
    }
    for(i=0; i<size; ++i)
      for(j=0; j<size; ++j)
          ifile >> matrix[i][j];
    ifile.close();
        
    cout << " Insert I: ";   // номер I-ой комнаты
    cin >> I;
    cout << " Insert J: ";   // номер J-ой комнаты
    cin >> J;
    if( (I-1 < 0) || (J-1 < 0) || (I-1 >= size) || (J-1 >= size) )
    {
       cout << " Parameter I or J is Bad!";
       exit(0);
    }     

    breadthSearch(size, I, J);

    getch();
    return 1;
}


Файл 'labirint.txt' для случая изображенного на рисунке http://comp-science.narod.ru/89-90/Net.gif :

6
0 0 1 0 0 0
0 0 0 1 0 0
0 0 0 1 1 0
0 0 0 0 0 0
0 0 0 1 0 1
0 0 0 0 0 0


Как вывести на экран путь из I в J?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.