Codeforce:“再次B. 8个皇后区”

时间:2018-12-24 19:22:34

标签: c n-queens

问题出在这里:B. 8 Queens, Again!!

我认为我并没有遇到最坏的情况或丢失任何东西。我的提交在测试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 个答案:

答案 0 :(得分:3)

您正在scanf将输入文件中坐标的字符放入int中。

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

int可能是4或8个字节。由于这些是本地的,因此它们的内容在设置之前是不确定的。字符进入第一个字节,其余字节仍未定义。它可能有效,但可能无效。另外,这在Big-endian机器上将永远无法使用,因为您将其存储在最高有效字节而不是最低有效字节中。参见:endianness

确保您的参数类型与scanf字符串一致。可能是您的编译器警告您warning: format ‘%c’ expects argument of type ‘char *’, but argument 2 has type ‘int *’的效果;如果是这样,这就是它试图告诉你的。