Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ UVA 11959骰子错误答案_C++ - Fatal编程技术网

C++ UVA 11959骰子错误答案

C++ UVA 11959骰子错误答案,c++,C++,所以我想解决这个问题。但问题的第三个例子给了我错误的答案。然后我发现如果我改变了 cin >> d1 >> d2; 到 这很有效,但我不知道为什么。然而,当我提交代码时,它表明我的答案是错误的。有人能帮我回答这两个问题吗 我的代码: #include <iostream> #include <cstdio> using namespace std; //rotate and flip the dice #define R(d) ( ((d) &

所以我想解决这个问题。但问题的第三个例子给了我错误的答案。然后我发现如果我改变了

cin >> 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;
}

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

cin>>d1>>d2将输入读取为十进制<代码>扫描频率(“%lx%lx”、&d1和&d2)将输入读取为十六进制

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


请注意,
hex
位是“粘性”位,因此它将保持设置,直到您指定另一个基数。这意味着当你阅读上面的
d1
d2
时,一个
hex
会同时影响这两个因素——但也意味着如果你以后阅读其他内容,它仍然会将其读作hex。

你需要两个附加条件,因为六面模具(立方体)可以以24种不同方式之一定向。您最初的算法只检查16个方向(主
main
中的4个位置乘以
E
=16中的4个位置),因此有时无法检测到相等。使用这两个新条件,您在
main
中有6个位置乘以
E
中的4个位置,总共24个。但是,请注意,您生成的24个方向都是不同的,这一点并不是很明显。(我想可能是的,但我没有花时间核实。)

谢谢!!它工作得很好。Sry我只能选择一个最好的解决方案,但两者都很棒。
#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;
}
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)))));