изучаю алгоритмы через решение задач, компилятор говорит ошибка прав доступа
#include <iostream>
using namespace std;
int main()
{
int n=0, i=0, k=0, p, sum = 0, t, I, b, s = 0, w = 0, winn=0;
cout << "Введите количесво падающих снежинок\n";
cin >> n;
int* summ;
summ = new int[n];
int*** mas;
mas = new int**[n];
mas[i] = new int*[n];
mas[i][k] = new int[6];
cout << "Введите значения лучей снежинок(каждая из снежинок имеет ровно шесть лучей),
ввод значени числа снежинок осущетвляется по порядку от первого луча первй снежинки до
последнего луча крайней.";
for (i = 0; i < n; i++, winn++) //перебор значенй
строки(заполнение таблицы в кждом столбце сумма длин лучей снежинки одинаковая)
{
for (p = 0; p < 5; p++) //перебор значений длин лучичов
снежинки
{
cin >> mas[i][k][p];
sum += mas[i][k][p]; //суммирование длин лучей снежинки
}
if (i == 0)summ[i] = sum; //присвоение суммы длин лучей
первому элементу из массива сумм длин лучей
else for (t = 0; t <= i; t++) //оператор перебора значений
массива сумм c перезаписью в столбец значений с равной суммой
{
if (summ[t] == sum) //если текущая сумма равна одной из
предыдущих массива значений сумм
{
I = i;
i = t;
for (k = 0; mas[i][k][0] > -1; k++); //поиск знначения всободного
столбца
for (p = 0; p < 5; p++) //перезапись значений текущего
элемента в столбец с той же суммой
{
mas[i][k][p] = mas[I][0][p]; //присвоение значения новому
элементу
mas[I][0][p] = -1; //"обнуление" текущего элемента
}
for (k = 0; k < n; k++)//СРАВНЕНИЕ СНЕЖИНОК (ВЫПОЛНЕНИЕ ОСНОВНОГО ЗАДАНИЯ)
{
for (p = 0; p < 5; p++)
//перебор значений лучей первой снежинки
{
for (b = 0; b < 5; b++)
//перебор значений лучей второй снежинки
{
if (mas[i][k][p] == mas[i][k + 1][b])
//если найдено одинаковое значение лучей снежинок
{
for (p = 0; p < 6 or s == 6; p++)
//перебор значений лучей первой снежики для скравнения всех элементов
{
if (p == 6) p = 0;
//перебор значей лучей второй снежинки для сравнения элементов
for (b = 0; b < 5; b++)
{
if (p == 6) p = 0;
//перехлод в начало снежинки при достижении крайнего элемента
if (mas[i][k][p] == mas[i][k + 1][b])s++;
//введение переменной для подсчёта последовательности одинаковх элементов
}
if (s == 6)w++;
//по достижении ряда из 6 одинаковых элементов происходит запись элемента отвечающего
за вывод ответа задачи
}
if (w == 1) goto win;
for (p = 5; p < 0; p--, s = 0)
//пербор значения первой снежинки в левую сторону(в случае перевёрнутой снежинки)
{
if (p % 6 == 0) p = 5;
//переход к последнему элементу первой снежинки при достижении первого элемента
for (b = 5; b < 0; b--)
//перебор значения второй снежинки в левую стороону
{
if (b % 6 == 0) p = 5;
//переход к последнему элементу второй снежинки при достижении первого
else if (mas[i][k][p] == mas[i][k + 1][b])s++;
//введение переменной для подсчёта последовательности одинаковх элементов
}
if (s == 6)w++;
//по достижении ряда из 6 одинаковых элементов происходит запись элемента отвечающего
за вывод ответа задачи
}
if (w == 1) goto win;
}
}
}
}
i = I - 1, k = 0;
//возвращение к предыдущему значению с целью повторной записи текущего
break;
}
else summ[i] = sum;
//если не найдётся раного значения в массиве сумм то текущая запишется в новую ячейку
}
if (i == n) goto gg ;
}
win:n = n - winn;
for (winn = 0; winn < n; winn++)
{
for (p = 0; p < 5; p++)
{
cin >> mas[winn][0][p];
}
}
cout << "есть одинаковые снежинки";
gg:
cout <<"НЕТ ОДИНАКОВЫХ СНЕЖИНОК";
}
Ответы (1 шт):
Автор решения: Harry
→ Ссылка
Если это, конечно, не шутка...
mas = new int**[n]; //Массив указателей на указатели
Инициализируется его единственный i-ый элемент (в этот момент i == 0
):
mas[i] = new int*[n];
И в этом массиве инициализируется единственный k-ый элемент (в этот момент k == 0
):
mas[i][k] = new int[6];
А обращаетесь-то вы не только к mas[0][0][]
, но и к другим элементам, разыменовывая случайные указатели.
Вы должны инициализировать все элементы (например, в цикле).
P.S. Крайне рекомендую почитать это и особенно вот это...
P.P.S. Об остальном коде не буду говорить, не смотрел. Однако обилие goto
, например, выглядит, скажем так, непривычно. Но если он все же работает, то, надеюсь, вы понимаете, что если ваш код выведет
есть одинаковые снежинки
то он обязательно выведет следом и
НЕТ ОДИНАКОВЫХ СНЕЖИНОК