История изменений
Исправление AnonymUser, (текущая версия) :
Не знаю, на самом деле. Кода я видел немного. Самым структурированным кажется ASM (но мне малопонятен).
#include <stdio.h>
#include <string.h>
// Объявим граф глобально
char a[] = "bcd";
char b[] = "def";
char c[] = "def";
char d[] = "ef";
char e[] = "f";
char f[] = "";
/* Массивы соответствий */
char *array_corresp[] = {a, b, c, d, e, f};
char array_corresp2[] = "abcdef";
//Рёбра
char *ribs[] = {
"ab", "ac", "ad", "bd", "be", "bf",
"cd", "ce", "cf", "de", "df", "ef"
};
//Длины рёбeр
int ribs_count[] = {12, 13, 14, 24, 25, 26, 34, 35, 36, 45, 46, 56};
//Длина массива с длинами рёбер
int ribs_all_count = sizeof(ribs_count) / sizeof(ribs_count[0]);
/////////////////Функции//////////////////////////////////////////////////////
// Вернёт элемент, который потом допишем в массив x
char element_search_to_push(char *x) {
char z;
int i;
for (i = 0; i < strlen(array_corresp2); i++) {
if (x[strlen(x) - 1] == array_corresp2[i]) {
z = array_corresp[i][0];
}
}
return z;
}
// Возвращает указатель на первый путь x
char *element_search(char *x, int j) {
char *arr;
int i;
for (i = 0; i < strlen(array_corresp2); i++) {
if (x[j - 1] == array_corresp2[i]) {
arr = array_corresp[i];
}
}
return arr;
}
static int array_search(const char *ar, char el) {
int i = 0;
while (ar[i] != '\0') {
if (ar[i] == el) return i;
i++;
}
return -1;
}
//Найдем длину каждого пути
int count_way_lenght(int rib_length , char *x) {
rib_length = 0;
int i, y;
for (y = 0; y < strlen(x) - 1; y++) {
for (i = 0; i < ribs_all_count; i++) {
if (x[y] == ribs[i][0] && x[y + 1] == ribs[i][1]) {
rib_length += ribs_count[i];
}
}
}
return rib_length;
}
/////////////////////////////////////////////////////////////////////////////////////////
int main() {
char short_way_point[100];
int y = 0;
int rib_length = 0;
int short_way = 1000;
int key;
//Первый путь задан
char x[] = "abdef";
char z;
// Длина j
int j = strlen(x) - 1;
char last_point = 'f';
int i = 0;
char *ar;
int x_len = 0;
// Печать 1-го
//////////////////////////////////////////////////
for (i = 0; x[i] != '\0'; i++)
printf("%c", x[i]);
// Найдем длину первого пути
rib_length = 0;
for (y = 0; y < strlen(x) - 1; y++) {
for (i = 0; i < 12; i++) {
if (x[y] == ribs[i][0] && x[y + 1] == ribs[i][1]) {
rib_length += ribs_count[i];
}
}
}
printf(" %d ", rib_length);
printf("\n\r");
///////////////////////////////////////////////////
// Основной цикл поиска путей
while (j != 0) {
// Определяем и ищем элемент и его ключ
ar = element_search(x, j);
key = array_search(ar, x[j]);
if ((key != -1) && (ar[key + 1] != '\0')) {
// Задаем длину массива равной j
x_len = j;
// Заменяем substr
x[j + 1] = '\0';
// Пишем в массив x
x[x_len++] = ar[key + 1];
// Найдем z для записи
z = element_search_to_push(x);
while (1) {
// Если дошли до 'f', выходим
if (x[strlen(x) - 1] == last_point ) {
x[x_len++] = z;
break;
}
// Пишем в x
x[x_len++] = z;
// Ещё найдем z для записи
z = element_search_to_push(x);
}
// Обновляем j
j = strlen(x);
// Выводим текущий путь
printf("%s", x);
// Пересчитываем длину пути
rib_length=count_way_lenght(rib_length, x);
// Печать длины пути
printf(" %d ", rib_length);
printf("\n\r");
// Обновляем кратчайший путь
if (rib_length < short_way) {
//Сохраним кратчайший путь
strcpy(short_way_point, x);
short_way = rib_length;
}
}
j--;
}
printf("Самый короткий путь: %d \n\r", short_way);
printf("Лежит через эти точки: %s \n\r", short_way_point);
return 0;
}
Исправление AnonymUser, :
Не знаю, на самом деле. Кода я видел немного. Самым структурированным кажется ASM (но мне малопонятен).
#include <stdio.h>
#include <string.h>
// Объявим граф глобально
char a[] = "bcd";
char b[] = "def";
char c[] = "def";
char d[] = "ef";
char e[] = "f";
char f[] = "";
/* Массивы соответствий */
char *array_corresp[] = {a, b, c, d, e, f};
char array_corresp2[] = "abcdef";
//Рёбра
char *ribs[] = {
"ab", "ac", "ad", "bd", "be", "bf",
"cd", "ce", "cf", "de", "df", "ef"
};
//Длины рёбeр
int ribs_count[] = {12, 13, 14, 24, 25, 26, 34, 35, 36, 45, 46, 56};
//Длина массива с длинами рёбер
int ribs_all_count = sizeof(ribs_count) / sizeof(ribs_count[0]);
/////////////////Функции//////////////////////////////////////////////////////
// Вернёт элемент, который потом допишем в массив x
char element_search_to_push(char *x) {
char z;
int i;
for (i = 0; i < strlen(array_corresp2); i++) {
if (x[strlen(x) - 1] == array_corresp2[i]) {
z = array_corresp[i][0];
}
}
return z;
}
// Возвращает указатель на первый путь x
char *element_search(char *x, int j) {
char *arr;
int i;
for (i = 0; i < strlen(array_corresp2); i++) {
if (x[j - 1] == array_corresp2[i]) {
arr = array_corresp[i];
}
}
return arr;
}
static int array_search(const char *ar, char el) {
int i = 0;
while (ar[i] != '\0') {
if (ar[i] == el) return i;
i++;
}
return -1;
}
//Найдем длину каждого пути
int count_way_lenght(int rib_length , char *x) {
rib_length = 0;
int i, y;
for (y = 0; y < strlen(x) - 1; y++) {
for (i = 0; i < ribs_all_count; i++) {
if (x[y] == ribs[i][0] && x[y + 1] == ribs[i][1]) {
rib_length += ribs_count[i];
}
}
}
return rib_length;
}
/////////////////////////////////////////////////////////////////////////////////////////
int main() {
char short_way_point[100];
int y = 0;
int rib_length = 0;
int short_way = 1000;
int key;
//Первый путь задан
char x[] = "abdef";
char z;
// Длина j
int j = strlen(x) - 1;
char last_point = 'f';
int i = 0;
char *ar;
int x_len = 0;
// Печать 1-го
//////////////////////////////////////////////////
for (i = 0; x[i] != '\0'; i++)
printf("%c", x[i]);
// Найдем длину первого пути
rib_length = 0;
for (y = 0; y < strlen(x) - 1; y++) {
for (i = 0; i < 12; i++) {
if (x[y] == ribs[i][0] && x[y + 1] == ribs[i][1]) {
rib_length += ribs_count[i];
}
}
}
printf(" %d ", rib_length);
printf("\n\r");
///////////////////////////////////////////////////
// Основной цикл поиска путей
while (j != 0) {
// Определяем и ищем элемент и его ключ
ar = element_search(x, j);
key = array_search(ar, x[j]);
if ((key != -1) && (ar[key + 1] != '\0')) {
// Задаем длину массива равной j
x_len = j;
// Заменяем substr
x[j + 1] = '\0';
// Пишем в массив x
x[x_len++] = ar[key + 1];
// Найдем z для записи
z = element_search_to_push(x);
while (1) {
// Если дошли до 'f', выходим
if (x[strlen(x) - 1] == 'f') {
x[x_len++] = z;
break;
}
// Пишем в x
x[x_len++] = z;
// Ещё найдем z для записи
z = element_search_to_push(x);
}
// Обновляем j
j = strlen(x);
// Выводим текущий путь
printf("%s", x);
// Пересчитываем длину пути
rib_length=count_way_lenght(rib_length, x);
// Печать длины пути
printf(" %d ", rib_length);
printf("\n\r");
// Обновляем кратчайший путь
if (rib_length < short_way) {
//Сохраним кратчайший путь
strcpy(short_way_point, x);
short_way = rib_length;
}
}
j--;
}
printf("Самый короткий путь: %d \n\r", short_way);
printf("Лежит через эти точки: %s \n\r", short_way_point);
return 0;
}
Исходная версия AnonymUser, :
Не знаю, на самом деле. Кода я видел немного. Самым структурированным кажется ASM (но мне малопонятен).