При запуске программы в codeblocks программа вылетает. Может проблема в двумерном динамическом массиве? Что я делаю не так? Помогите исправить ошибку

Рейтинг: -1Ответов: 1Опубликовано: 18.04.2023
//Поиск в ширину

#include <cstdlib>
#include <fstream>
#include <iostream>
#include <string>

using namespace std;

int next (int i, int cur, int **A, int N)       //функция получения индекса следующей после cur смежной вершины для вершины i
{
    cur++;
    while (cur<N && !A[i][cur]) cur++;
    if (cur<N) return cur;
    return -1;              //если смежных больше нет, возвращаем признак отсутствия
}

void BFS (int a, int P[], int **A, int N)
{
   int x, y, queue[N], beg = 0, end=-1;
   queue[++end] = a;   /* помещаем вершину в очередь */
   P[a] = 1;    /* помечаем ее посещенной */
   while (beg <= end)      /* пока очередь не пустa */
   {
      x = queue[beg++];      /* берем элемент из очереди */
      y = -1;
      do
      {
         y = next (x, y, A, N); /* находим смежную с данной вершину */
         if (y != -1 && !P[y])   /* если есть смежная и она новая */
         {
            queue[++end] = y;       /* помещаем ее в очередь */
            P[y] = 1;               /* помечаем ее посещенной */
         }
      }
      while (y != -1); /* пока не переберем все смежные с х вершины */
   }
}

int main()
{
    setlocale(LC_ALL, "Rus");
    int N, x, q, i, s = 0, j = 0;
    bool t = 0;
    string str;
    ifstream f;
    f.open("myfile.txt");
    if (!f.is_open()){
        cout<<"Ошибка открытия файла"<<endl;
        return 1;
    }
    else{
        cout<<"Файл открыт"<<endl;
        getline(f, str);
        N = str[0] - '0';
    }
    int **A = new int*[N];
    for (i = 0; i < N; i++)
        A[i] = new int[N];
    int P[N]={};
    while (getline(f, str)){
        cout <<endl<<str<< endl;
        for (i = 0; str[i]!='\0'; i++){
            if (str[i]!=' '){
                A[j][i] = str[i] - '0';
                cout<<"pp="<<A[j][i]<<" ";
            }
        }
        cout<<endl<<"j = "<<j<<endl;
        j++;
    }
    f.close();
    BFS(0, P, A, N);
    for (q=0; q<N; q++){
        for (x=0, s=0; x<N; x++)
            if (P[x] == 1) s++;
        if (s == N){
            cout<<"Остовное дерево существует"<<endl;
            t = 1;
            break;
        }
        if (P[q]==0)  BFS(x, P, A, N);      //если есть непосещенные вершины, запускаем поиск
    }
    if (!t) cout<<"Остовное дерево не существует"<<endl;
    for (i = 0; i < N; i++)
        delete[] A[i];
    system("pause");
    return 0;
}

Ответы

▲ 0

Сам нашёл ошибку. Ошибка в массиве при передаче в него данных. Введите переменную k равную 0, и в цикле for она как и i равна 0 и изменяется на 1. Но если str[i] = пробелу, то k- -. Следовательно и в массив мы пишем A[j][k].