Codeforces: B. 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;
}

person Tangent    schedule 24.12.2018    source источник
comment
Попробуйте распечатать координаты. Ваш scanf может читать символ новой строки. Я всегда использую fgets только для того, чтобы избавиться от символа новой строки в конце строки.   -  person Yuri J    schedule 24.12.2018


Ответы (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 *’; если да, то это то, что он пытался вам сказать.

person Perette    schedule 24.12.2018
comment
Для какого ввода это вызывает проблемы или программа дает сбой в версии OP, но работает для вашей версии? Пожалуйста, приведите соответствующий пример. - person Yunnosch; 24.12.2018
comment
@Yunnosch Это исправляет предупреждение о компиляции, а поскольку x является локальным, оно имеет неопределенное значение. scanf изменяет первый байт, но не остальные. Вероятно, они равны нулю, потому что это только что запущенная программа, но даже в этом случае я ожидаю различного поведения на архитектурах с прямым и прямым порядком байтов. - person Perette; 24.12.2018
comment
Вы могли бы заметно улучшить свой ответ, объяснив эти вещи внутри ответа и более подробно. Пожалуйста, попробуйте объяснить, как может пройти первый случай (согласно OP, только тест 2 не проходит). Только если вы можете объяснить, что это на самом деле отвечает на вопрос. - person Yunnosch; 24.12.2018