UVA 11959骰子错误答案

时间:2013-09-05 05:43:38

标签: c++

所以我试图解决uva 11959 Dice。但问题的第三个例子给了我错误的答案。然后我发现我是否改变

cin >> d1 >> d2;

scanf("%lx %lx", &d1, &d2);

它有效,但我不知道为什么。但是,当我提交我的代码时,它表明我的答案是错误的。有人可以帮我解决这两个问题吗?

我的代码:

#include <iostream>
#include <cstdio>
using namespace std;

//rotate and flip the dice
#define R(d) ( ((d) & 0x000F00) << 12 | ((d) & 0x00000F) << 16 | ((d) & 0x00F0F0)
  | ((d) & 0x0F0000) >> 8 | ((d) & 0xF00000) >> 20  )
#define F(d) (((d) & 0x000F0F) | ((d) & 0x00F000) << 8 | ((d) & 0x0000F0) << 12 
  | ((d) & 0x0F0000) >> 4 | ((d) & 0xF00000) >> 16)

bool E(long d1, long d2)
{
    return ( (d1) == (d2) || (d1) == R(d2) || (d1) == R(R(d2)) || (d1) == R(R(R(d2))) );
}


int main()
{
    long d1, d2;
    long counter;
    bool equal;
    cin >> counter; 
    for( int i = 0 ; i < counter ; i++ )
    {
        scanf("%lx %lx", &d1, &d2);
        //  cin >> d1 >> d2;
        equal =  E(d1, d2) || E(d1, F(d2)) || E(d1, F(F(d2))) 
             || E(d1,F(F(F(d2)))) ;

    if(equal)
        cout << "Equal";
    else
        cout << "Not Equal";
    cout << endl;
    }

    return 0;
}

ADD: 我发现在我的for循环中我需要再添加两个条件来确定“相等”。所以看起来应该是这样的:

equal = E(d1, d2) || E(d1, F(d2)) || E(d1, F(F(d2))) || E(d1, F(F(F(d2)))) || E(d1, F(R(d2))) || E(d1, F(R(R(R(d2))))); 

但我仍然不知道为什么我需要添加这两个条件。是不是已经被覆盖了?

2 个答案:

答案 0 :(得分:2)

您需要两个附加条件,因为六面模具(立方体)可以采用24种不同方式之一。您的原始算法仅检查16个方向(main中的4个位置乘以E = 16中的4个位置),因此有时无法检测到相等性。在这两个新条件下,main中有6个位置E中有4个位置,共有24个位置。但是,请注意,您生成的24个方向都不是很明显不同。 (我认为它们可能是,但我没有花时间来验证它。)

答案 1 :(得分:1)

cin >> d1 >> d2;将输入读取为十进制。 scanf("%lx %lx", &d1, &d2);以十六进制的形式读取输入。

如果您希望使用iostream将输入读取为十六进制,则可能需要使用std::hex操纵器,例如:cin >> hex >> d1 >> d2;

请注意hex位是“粘滞”的,所以它会保持设置,直到您指定另一个基数为止。这意味着当您在上面阅读hexd1时,d2会影响这两个 - 但这也意味着如果您之后阅读了其他内容,它仍会将其视为十六进制。