Почему следующий код выдает ошибку времени выполнения, даже если он показывает желаемый результат?

Я решаю проблему 8 ферзей, используя возврат. Когда я скомпилировал следующий код в IDE codechef, он показал правильный вывод, но все равно он показывает ошибку времени выполнения.

#include <stdio.h>
#include <math.h>
int board[8][8] = { { 0 } };
int demi[8][8] = { { 0 } };
int queen(int a, int b, int c);
void mark(int a, int b);
int main()
{
    int i;
    int b = queen(3, 0, 0);
    for (i = 0; i < 64; i++)
    {
        int x = board[i / 8][i % 8];
        if (x == 1)
            printf(" %d ", x);
        else
        {
            printf(" 0 ");
        }
        if ((i + 1) % 8 == 0)
            printf("\n");
    }
}
int queen(int a, int b, int c)
{
    int t;
    if (c == 8)
        return 1;
    if (a < 0 || a > 7 || b < 0 || b > 7)
        return 0;
    if (!(board[a][b] == 0))
        return 0;
    for (t = 0; t < 64; t++)
    {
        demi[t / 8][t % 8] = board[t / 8][t % 8];
    }
    mark(a, b);
    board[a][b] = 1;
    /*  for(t = 2; t<8; t++)
     {
     if(queen(a+(9-t), b+1, c+1))
     return 1;
     if(queen(a-t, b+1, c+1))
     return 1;
     }*/
    if (queen(a + 7, b + 1, c + 1))
        return 1;
    if (queen(a + 6, b + 1, c + 1))
        return 1;
    if (queen(a + 5, b + 1, c + 1))
        return 1;
    if (queen(a + 4, b + 1, c + 1))
        return 1;
    if (queen(a + 3, b + 1, c + 1))
        return 1;
    if (queen(a + 2, b + 1, c + 1))
        return 1;
    if (queen(a - 2, b + 1, c + 1))
        return 1;
    if (queen(a - 3, b + 1, c + 1))
        return 1;
    if (queen(a - 4, b + 1, c + 1))
        return 1;
    if (queen(a - 5, b + 1, c + 1))
        return 1;
    if (queen(a - 6, b + 1, c + 1))
        return 1;
    if (queen(a - 7, b + 1, c + 1))
        return 1;
    board[a][b] = 0;
    for (t = 0; t < 64; t++) {
        board[t / 8][t % 8] = demi[t / 8][t % 8];
    }
    return 0;
}
void mark(int a, int b)
{
    int i;
    for (i = 0; i < 64; i++)
    {
        int row = i / 8;
        int col = i % 8;
        if (row == a || col == b && !(row == a && col == b))
            board[row][col] = 2;
        if (abs(row - a) == abs(col - b))
            board[row][col] = 2;
    }
}

Выход:

Более того, если я изменю выражение водителя на " queen(0,0,0) or queen(1,0,0) Msgstr "Результат исправлен до 4-5 столбцов, но в остальных оставлено 0.

Куда я иду не так?

1 ответ

Более того, если я изменю выражение водителя на "queen(0,0,0) or queen(1,0,0)Msgstr "Результат исправлен до 4-5 столбцов, но в остальных оставлено 0.

Есть небольшой, но эффективный контроль: массив demi хранить состояние платы предыдущего экземпляра в цепочке рекурсии queen() определяется глобально; следовательно, рекурсивные вызовы queen() перезаписать сохраненное состояние предыдущих вызовов, помешая возврату. Ваша программа работает, если demi определяется локально в queen(),


Что касается статуса выхода из программы, значение b в конце main() подходит для использования в return !b;, поскольку значение 1 возвращается из queen() обозначает успех

Просто посмотрите на свою основную рутину:

int main()
{
    ...
    if((i+1)%8==0)
    printf("\n");
}

он должен вернуть 0 при успешном завершении, но вы ничего не возвращаете: так что даже если ваша программа делает то, что вы хотите, так как ваш код возврата не определен.

В этом случае маловероятно, что это будет 0 => рассматривается как неправильное выполнение движком, выполняющим его, который даже не пытается углубляться в анализ результатов программы.

Fix:

    if((i+1)%8==0)
    printf("\n");
    return 0;
}

Как прокомментировали несколько человек, return 0 Заявление не является обязательным в C99. Но я полагаю, что ваша онлайн-платформа применяет строгие правила C89, поэтому вы должны добавить ее.

Другие вопросы по тегам