LINUX.ORG.RU

История изменений

Исправление 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 (но мне малопонятен).