【问题标题】:Codeforces: "B. 8 Queens, Again"Codeforces:“B. 8 Queens, Again”
【发布时间】:2018-12-24 19:22:34
【问题描述】:

问题出在这里: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;
}

【问题讨论】:

  • 尝试打印坐标。您的 scanf 可能正在读取换行符。我总是使用fgets 只是为了去掉行尾的换行符。

标签: c n-queens


【解决方案1】:

您将scanf输入文件中的坐标字符转换为int

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

int 可能是 4 或 8 个字节。由于这些是本地的,因此它们的内容在设置之前是未定义的。字符进入第一个字节,其余字节仍未定义。它可能有效,也可能无效。此外,这永远不会在大端机器上工作,因为您将它存储在最重要的字节而不是最不重要的字节中。见:endianness

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

【讨论】:

  • 对于哪个输入会导致麻烦或程序在 OPs 版本中失败但适用于您的版本?请提供相应的示例。
  • @Yunnosch 它修复了编译警告,并且由于x 是本地的,它具有未定义的值。 scanf 更改第一个字节,但不更改其余字节。可能它们为零,因为它是一个新推出的程序,但即便如此,我预计小端与大端架构上的行为会有所不同。
  • 您可以通过在答案中更详细地解释这些内容来显着改善您的答案。请尝试解释第一种情况如何通过(根据 OP,只有测试 2 失败)。只有当你能解释它确实回答了问题时。
猜你喜欢
  • 2011-11-10
  • 1970-01-01
  • 2023-03-04
  • 2013-03-28
  • 1970-01-01
  • 1970-01-01
  • 2014-09-07
  • 2012-11-25
  • 2021-08-11
相关资源
最近更新 更多