Выяснить, есть ли среди N населенных пунктов изолированные города - C (СИ) (158059)
Формулировка задачи:
Пожалуйста! помогите отладить 2 программы, они рабочие, но в коде есть мелкие ошибки, которые я не могу исправить. Заранее спасибо.
1)Имеются N населённых пунктов (N≤15), и сеть авиалиний, соединяющих эти города. Сеть задана матрицей связности M(N, N), где M(i, j)=0, если города i и j не связаны между собой, и M(i, j)=l - в противном случае. Выяснить, есть ли среди N населенных пунктов изолированные города (такие, в которые нельзя долететь).
2)Дана матрица B(N,M) (N≤M, M≤13). Найти сумму элементов каждого столбца матрицы. Сформировать массив D из найденных сумм.
#include <stdio.h>
//Сюда пишем сколько надо городов, но помним, что N<= 15
#define kolichestvo_gorodov 11
int main () {
int j, k, i;
//матрица связности, это матрица ОБЯЗАНА быть симметричной относительно диагонали,
//которая идёт от левого верхнего угла к правому нижнему углу
bool N [kolichestvo_gorodov] [kolichestvo_gorodov]= {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 1, 1, 1, 0, 1, 1, 0, 0, 1, 0,
0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0,
0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0,
0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
//для проверки:
// 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
// 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
// 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
// 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
// 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
// 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
// 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
// 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
// 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
// 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
// 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};
//
// 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
// 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
// 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
// 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
// 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
// 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
// 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
// 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
// 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
// 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
// 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
//Решение задачи заключается в том, чтобы найти нулевые столбцы (или строки, без разницы)
//Номера таких столбцов или строк и будут номерами искомых городов
//В этот массив будем вписывать номера городов. Теоретически их может быть kolichestvo_gorodov
//(в нашем случае 11)
int goroda_bez_svazi [kolichestvo_gorodov];
//Обязательно обнуляем этот массив
for (int i= 0; i< kolichestvo_gorodov; i++) {
goroda_bez_svazi [i]= kolichestvo_gorodov;
}
//Заполняем
k= 0;
for (int i= 0; i< kolichestvo_gorodov; i++) {
for (j= 0; j< kolichestvo_gorodov && !N [i] [j]; j++) { }
if (j== kolichestvo_gorodov)
goroda_bez_svazi [k++]= i;
}
//массив сформирован, осталось только вывести его
//Выводим до первого нулевого элемента или до конца (если все города без связи)
if (goroda_bez_svazi [0]== kolichestvo_gorodov) {
printf ("Vse goroda so svazu\n");
getchar ();
return 0;
}
else {
j= 0;
printf ("Nomera gorodov bez svazu\n");
do {
printf ("%d ", goroda_bez_svazi [j++]);
}
while (j!= kolichestvo_gorodov && goroda_bez_svazi [j]!=11);
}
printf ("\n");
getchar ();
return 0;
}#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
int M = 0, N = 0;
int i=0; int j=0, **B, *D;
printf("Введите число M в десятичной системе считсления: ");
scanf("%d", &M);
printf("Введите число N в десятичной системе считсления: ");
scanf("%d", &N);
if(M > 13 || M == 0)
{ printf("Число М имеет неверное значение\n"); system("pause"); return -1; }
if(N > M || N == 0)
{ printf("Число N имеет неверное значение\n"); system("pause"); return -1; }
// Создание динамического двумерного массива
// Сначала выделяется память под N указателей
// Затем в цикле каждому указателю вектор размером M
**B = (int**)malloc(N*sizeof(int*));
for ( i = 0; i < N; i++)
B[i] = (int*)malloc(M*sizeof(int));
// Заполнение матрицы случайными значениями
for ( i = 0; i < N; i++)
for (j = 0; j < M; j++)
B[i][j] = rand()%10;
// Вывод матрицы
printf("Исходная матрица\n");
for ( i = 0; i < N; i++)
{
for (j = 0; j < M; j++)
printf("%d\t", B[i][j]);
printf("\n");
}
// Выделяем память под массив
*D = (int*)malloc(M*sizeof(int));
// Подсчет суммы и одновременный вывод
printf("\nПодсчет сумм\n");
for( i = 0; i < M; i++)
{
D[i] = 0;
for(j = 0; j < N; j++)
{
D[i] += B[j][i];
}
printf("%d столбец: %d\n", (i+1), D[i]);
}
// Освобождаем выделенную память
free(D);
// Освобождение выделенной памяти
// Для каждого malloc свой free!
for ( i = 0; i != N; ++i)
free(B[i]);
free(B);
getch();
return 0;
}
вопрос ещё актуален.
помощь ещё нужна...чем быстрее тем лучше)
Решение задачи: «Выяснить, есть ли среди N населенных пунктов изолированные города»
textual
Листинг программы
D = (int*)malloc(M*sizeof(int));
Объяснение кода листинга программы
- В коде выделяется память для массива D типа int, размер которого равен M*sizeof(int).
- Значение M — количество населенных пунктов, а тип int — это целое число, которое будет использоваться для хранения информации о населенных пунктах.
- Каждому населенному пункту будет присвоено уникальное значение от 0 до M-1, которое будет храниться в массиве D.
- Присваивание значения 0 будет означать, что данный населенный пункт является изолированным городом.
- Значение M-1 будет означать, что данный населенный пункт не является изолированным городом.
- Для определения, является ли какой-либо населенный пункт изолированным городом, будет использоваться алгоритм двоичного поиска, который будет искать значение 0 в массиве D.
- Если значение 0 будет найдено, то населенный пункт с таким значением будет считаться изолированным городом.
- Если значение 0 не будет найдено, то населенный пункт с таким значением будет считаться неизолированным городом.