Codeforces: "Б. 8 Королев снова"

Проблема здесь: B. 8 Королев, Опять!!

Я думаю, что я не получаю худшие случаи или пропускаю что-то. Моя заявка не прошла в тесте 2.

Я только что проверил строки, столбцы и диагонали для каждого ввода со своими следующими. Я думал, что этого будет достаточно. Есть ли другой случай, когда он может быть действительным или недействительным? Я не уверен, что мой код все правильно, хотя.

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int t, y[9], x[9], i, j, valid;
    scanf("%d", &t);
    while(t--)
    {
        valid = 1;
        for(i = 0; i < 8; i++)
        {
            scanf(" %c %d", &x[i], &y[i]);
        }
        for(i = 0; i < 8; i++)
        {
            for(j = i+1; j < 8; j++)
            {
                if(x[i] == x[j] || y[i] == y[j] || abs(x[i] - x[j]) == abs(y[i]-y[j])) valid = 0;
            }
        }
        (valid) ? printf("Valid\n") : printf("Invalid\n");
    }
    return 0;
}

1 ответ

Решение

Вы scanfввод символа координат во входном файле в int,

for(i = 0; i < 8; i++)
{
    char row;
    scanf("%1c%1d ", &row, &y[i]);
    x[i] = row - 'A';
}

int вероятно 4 или 8 байт. Поскольку они являются локальными, их содержимое не определено, пока не установлено. Символ переходит в первый байт, остальные байты все еще не определены. Это может сработать, а может и нет. Кроме того, это никогда не будет работать на машинах с прямым порядком байтов, поскольку вы храните его в старшем байте, а не в младшем. Смотрите: порядок байтов

Убедитесь, что ваши типы аргументов согласуются с scanf строка. Возможно, ваш компилятор дал вам предупреждение о warning: format ‘%c’ expects argument of type ‘char *’, but argument 2 has type ‘int *’; если так, то это то, что он пытался вам сказать.

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