Как исправить ошибку «~ нет ответа на стандартный вывод ~» в HackerRank?

#c

#c

Вопрос:

Я пытаюсь решить эту проблему в HackerRank, и как только я отправляю свое решение, компилятор показывает, wrong answer и это показывает ~ no response on stdout ~ в окне вывода. Как мне это исправить?

Вопрос:

Учитывая 2D-массив размером 6X6, A,

 1 1 1 0 0 0
0 1 0 0 0 0
1 1 1 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
  

Мы определяем песочные часы в A как подмножество значений с индексами, попадающими в этот шаблон в графическом представлении A:

 a b c
  d
e f g
  

В A 16 песочных часов, и сумма песочных часов — это сумма значений песочных часов.

Задача

Вычислите сумму песочных часов для всех песочных часов в A, затем выведите максимальную сумму песочных часов.

Я уже пытался решить проблему. Я просто не могу избавиться от этого сообщения об ошибке. Логика и решение кажутся правильными.

 #include <assert.h>
#include <limits.h>
#include <math.h>
#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char *readline();
char **split_string(char *);

void func(int arr[][100]) {
    int hgs[4][4];
    int i = 0, j = 0;
    for (i = 0; i < 4; i  ) {
       for (j = 0; j < 4; j  ) {
           hgs[i][j] = arr[i][j]   arr[i][j 1]   arr[i][j 2]  
                       arr[i 1][j 1]  
                       arr[i 2][j]   arr[i 2][j 1]   arr[i 2][j 2];
        }
    }
    int max = hgs[0][0];
    for (i = 0; i < 4; i  ) {
        for (j = 0; j < 4; j  ) {
            if (hgs[i][j] > max)
                max = hgs[i][j];
        }
    }
    printf("%d", max);
}

int main() {
    int **arr = malloc(6 * sizeof(int*));

    for (int i = 0; i < 6; i  ) {
        *(arr   i) = malloc(6 * (sizeof(int)));

        char **arr_item_temp = split_string(readline());

        for (int j = 0; j < 6; j  ) {
            char* arr_item_endptr;
            char* arr_item_str = *(arr_item_temp   j);
            int arr_item = strtol(arr_item_str, amp;arr_item_endptr, 10);

            if (arr_item_endptr == arr_item_str || *arr_item_endptr != 
'') {
                exit(EXIT_FAILURE);
            }
            *(*(arr   i)   j) = arr_item;
       }
    }
    func(**arr);
    return 0;
}

char *readline() {
    size_t alloc_length = 1024;
    size_t data_length = 0;
    char* data = malloc(alloc_length);

    while (true) {
        char *cursor = data   data_length;
        char *line = fgets(cursor, alloc_length - data_length, stdin);

        if (!line) {
            break;
        }
        data_length  = strlen(cursor);
        if (data_length < alloc_length - 1 || data[data_length - 1] == 
'n') {
            break;
        }

        size_t new_length = alloc_length << 1;
        data = realloc(data, new_length);
        if (!data) {
            break;
        }

        alloc_length = new_length;
    }

    if (data[data_length - 1] == 'n') {
        data[data_length - 1] = '';
    }

    data = realloc(data, data_length);

    return data;
}

char **split_string(char *str) {
    char **splits = NULL;
    char *token = strtok(str, " ");

    int spaces = 0;

    while (token) {
        splits = realloc(splits, sizeof(char*) *   spaces);
        if (!splits) {
            return splits;
        }

        splits[spaces - 1] = token;

        token = strtok(NULL, " ");
    }
    return splits;
}
  

Ожидаемый результат 19 для образца ввода, но я не получаю никакого вывода.

Ответ №1:

Ваш код очень сложный для этой простой программы, но проблема может быть очень простой:

  • Прототип для func должен быть:

     void func(int **arr)
      
  • Вы должны завершить свой вывод новой строкой:

         printf("%dn", max);
      
  • Вы должны передать массив func таким образом:

         func(arr);
      

Вот упрощенная версия func кода:

 void func(int **arr) {
    int i, j, cur, max = INT_MIN;
    for (i = 0; i < 4; i  ) {
        for (j = 0; j < 4; j  ) {
            cur = arr[i][j]   arr[i][j 1]   arr[i][j 2]  
                  arr[i 1][j 1]  
                  arr[i 2][j]   arr[i 2][j 1]   arr[i 2][j 2];
            if (max < cur)
                max = cur;
        }
    }
    printf("%dn", max);
}
  

Вот значительно упрощенная версия всей программы:

 #include <limits.h>
#include <stdio.h>

int main() {
    int grid[6][6];
    int i, j, cur, max = INT_MIN;

    for (i = 0; i < 6; i  ) {
        for (j = 0; j < 6; j  ) {
            if (scanf("%d", amp;grid[i][j]) != 1)
                return 1;
        }
    }
    for (i = 0; i < 4; i  ) {
        for (j = 0; j < 4; j  ) {
            cur = arr[i][j]   arr[i][j 1]   arr[i][j 2]  
                  arr[i 1][j 1]  
                  arr[i 2][j]   arr[i 2][j 1]   arr[i 2][j 2];
            if (max < cur)
                max = cur;
        }
    }
    printf("%dn", max);
    return 0;
}
  

Комментарии:

1. Нет. На самом деле, я только ввел функцию func. В дополнение к этому мне пришлось написать оператор вызова функции в функции main. Остальной код уже был там. Я не могу удалить эти части кода.

2. @AdityaG901: такой плохой пример чрезмерно сложного кода для простой задачи. Тогда просто исправьте код для функции func и ее вызова в соответствии с моими замечаниями.

3. Я попытался реализовать оба упомянутых вами изменения, включая инициализацию max с помощью INT_MIN. На выходе получается 1104762770

4. Он просто выдает нежелательное значение каждый раз, когда я его запускаю

5. @AdityaG901: Вы изменили прототип и синтаксис вызова? Вы компилируете в своей собственной системе с включенными предупреждениями или только на сайте challenge? Каким вы видите результат?