логика печати этого шаблона - PullRequest
0 голосов
/ 25 августа 2018
                        4 4 4 4 4 4 4  
                        4 3 3 3 3 3 4   
                        4 3 2 2 2 3 4   
                        4 3 2 1 2 3 4   
                        4 3 2 2 2 3 4   
                        4 3 3 3 3 3 4   
                        4 4 4 4 4 4 4   

мы должны сделать программу для вышеприведенного шаблона

#include <stdio.h>

int main() 
{

    int n;
    scanf("%d", &n);
    int len = n*2 - 1;
    for(int i=0;i<len;i++){
        for(int j=0;j<len;j++){
            int min = i < j ? i : j;
            min = min < len-i ? min : len-i-1;
            min = min < len-j-1 ? min : len-j-1;
             printf("%d ", n-min);
        }
        printf("\n");
    }
return 0;
}

это код для печати вышеуказанного шаблона, который я получаю, что является основным Логика этих кодов Я пытаюсь отладить и проследить этот код за 4 часа. Пожалуйста, если кто-нибудь может помочь мне только в логике этого кода, это будет очень полезно (я новичок в программировании) особенно в этих строках

           int min = i < j ? i : j;
            min = min < len-i ? min : len-i-1;
            min = min < len-j-1 ? min : len-j-1;

1 Ответ

0 голосов
/ 26 августа 2018

Ниже приведена почти идентичная версия, которую гораздо проще понять.Три запутанные строки из исходной программы закомментированы, с тремя приведенными ниже строками замены.

#include <stdio.h>

int main()
{

int n;
scanf("%d", &n);
int len = n*2 - 1;
for(int i=0;i<len;i++){
    for(int j=0;j<len;j++){
//            int min = i < j ? i : j;
//            min = min < len-i ? min : len-i-1;
//            min = min < len-j-1 ? min : len-j-1;
            int min_dist_top_or_bottom = i < len-i ? i : len-i-1;
            int min_dist_left_or_right = j < len-j ? j : len-j-1;
            int min = min_dist_top_or_bottom < min_dist_left_or_right ? min_dist_top_or_bottom : min_dist_left_or_right;
         printf("%d ", n-min);
    }
    printf("\n");
}
return 0;
}

В закомментированной версии он выполняет те же вычисления, но строит их странным образом.Пересмотренная версия стремится сохранить вычисления независимыми, пока они не будут объединены для формирования ответа.После понимания пересмотренной версии, оригинальную легче разобрать.

В пересмотренной версии первая строка вычисляет, находится ли текущий индекс строки i ближе к верхней или нижней части таблицы.,На основании этого он возвращает расстояние до ближайшего края.Вторая строка очень похожа, но работает с индексом столбца j, поэтому она возвращает расстояние до ближайшего левого или правого края.

Третья строка выбирает меньшее из значений, рассчитанных дляпредыдущие две строки.

Причина, по которой все это напоминает «расстояние от центра», заключается в том, что последующее printf вычитает вычисленное значение из n, где n - половина ширинытаблица ... и максимальное расстояние, которое индекс может быть от края, является центром (то есть, на полпути между каждым краем).

Так что теперь вы можете прочитать исходную версию алгоритма как созданиескорее произвольный выбор, чтобы начать с меньшего из i или j в первой строке.Затем следующие две строки делают то же самое, что и первые две строки пересмотренной версии, но вы должны перенести знание, что min является либо i, либо j.

Рассмотрим первуюиз этих строк: если min == i, то строка буквально идентична пересмотренной версии;но если min == j, то случай (в пересмотренной версии), где i < len-i является спорным, так как j уже меньше, чем результирующее значение i.Однако случай, когда len-i-1 меньше, чем min / j, все еще обрабатывается.

Короче говоря, оригинал намного сложнее понять, потому что он заставляет читателя мысленно анализировать ситуацию.анализ случая и держать все результаты в своей голове.Пересмотренная версия вычисляет простые автономные значения, а затем объединяет их в желаемый результат.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...