C ++中的公牛和奶牛游戏遇到了奶牛问题

时间:2017-01-02 18:41:07

标签: c++ algorithm

我正试图让公牛和奶牛的比赛奏效。 "公牛和奶牛"是一个生成密码的游戏,你试图猜测它。

  • A' bull'表示您在正确的位置猜到了正确的数字;
  • 一头牛是一个正确的号码,但在错误的地方。

即:代码0123,猜测为0245有1头公牛(零)和1头牛,因为有两个但不在那个位置。

我的游戏只使用1和0,但长度为9位。使用下面的for循环,公牛很干净但我不能让奶牛上班。要么我得到一个荒谬的答案,如" 36/9奶牛"或者它只是休息。

该代码背后的想法是,如果不匹配(不是公牛)对可以分为1和0,那么两个组中较小的一个,当加倍时,将是奶牛的总数,同时考虑1和0,同时丢弃剩余的非牛或牛数。

int bull = 0, cow = 0;
//checking bull or cow
for (int i = 0; i < guess.size(); ++i)
{
    for (int j = 0; j < guess.size(); j++)
    {
        if (guess[i] == n[j] && j == i)         //correct num in right position
            bull++;
        }
    }
    // finding and seperating cows
    int cow1 = 0, cow0 = 0;
    for (int i = 0; i < guess.size(); ++i)
    {
        for (int j = 0; j < guess.size(); j++)
        {
            if (guess[i] == n[j] && i != j && i == 1)          
                cow1++;
            if (guess[i] == n[j] && i != j && i == 0)
                cow0++;
        }
    }
    if (cow0 < cow1)
        cow = cow0;
    else if (cow1 < cow0)
        cow = cow1;
    cow = cow * 2;

    cout << "You have " << bull << "/9 bulls" << endl << "And " << cow << "/9 cows" << endl;

2 个答案:

答案 0 :(得分:0)

首先,一个问题:既然你的游戏只适用于0和1,那么以下是不是真的?

  1. 如果0不是公牛而且解决方案至少包含一个0,那么它必须是一头牛;
  2. 如果一个1不是公牛而且该解决方案至少包含一个1,则它必须是一头牛。
  3. 这可以为您提供更简单的解决方案。

    无论如何,让我们想一个更普遍的情况,你不仅限于1和0。

    开始迭代猜测:

    int bulls = 0;
    int cows = 0;
    

    对于每个猜测,检查它是否是公牛。如果是,则增加公牛的数量。否则,检查它是否是牛。

    for (int i = 0; i < guess.size(); i++) {
        if (isBull(guess, n, i)) {
            bulss++;
        }
        else if (isCow(guess, n, i)) {
            cows++;
        }
    }
    

    这是您的功能isBull应该是什么样的(我猜测guess应该是std::vector<int>类型,但我不太确定关于n;因为你没有明确说明,我只是放了一些内容)

    int isBull(<datatype> guess, <dataype> solution, int pos) {
        return guess[pos] == solution[pos];
    }
    

    isCow()应该有类似的参数。如果solution中的值出现,它应该只检查guess[pos]中的所有位置。它可能会涉及到这样的事情:

    for (int i = 0; i < SOMETHING; i++) {
        if (i != pos && guess[pos] == solution[i]) {
            DO SOMETHING;
        }
    }
    

    我希望你能理解我试图去做的地方。我真的不想破坏你的乐趣/学习过程,所以我会离开&#34; DO SOMETHING&#34;为了你完成。但如果您有疑问,请发表评论,然后我会尝试回答。

    我想说的一件事:只有在你确定它不是公牛的情况下,才能验证猜测中的位置是否是牛。它会真正简化你的思维过程。

答案 1 :(得分:0)

thanks for the help but i went another way.
if anyone else needs an answer to this:

//checking bull or cow
                        for (int i = 0; i < guess.size(); ++i)
                        {
                            if (guess[i] == n[i])         //correct n`enter code here`um in right position
                                bull++;
                        }
                        // finding and seperating cows
                        int cow1 = 0, cow0 = 0;
                        for (int i = 0; i < guess.size(); ++i)
                        {
                            if (guess[i] != n[i])
                            {
                                if (guess[i] == 1)
                                    cow1++;
                                else
                                    cow0++;
                            }
                        }
                        if (cow0 < cow1)
                        {
                            cow = cow0;
                        }
                        else
                            cow = cow1;
                        cow = cow * 2;