2017-01-02 93 views
-2

我想要一头公牛队和奶牛队的比赛。 “公牛和奶牛”是一个游戏,其中产生了一个秘密号码,你试图猜测它。公牛队和奶牛队的比赛在C++中遇到了奶牛的问题

  • 'bull'代表您何时在正确的位置猜出了正确的数字;
  • 牛是一个正确的号码,但在错误的地方。

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

我的游戏只使用1和0,但是是九位数字。使用下面的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; 
+0

你在循环内部的条件是没有意义的。例如,为什么有两个循环用于计算公牛数量,如果有足够的数量并且您检查了例如'猜[i] == n [i]'。与第二个循环类似,在那里你根本不需要外部循环,因为在这种情况下,你只能对“guess [0]”和“guess [1]”进行检查。 –

+0

*“我的游戏只使用1和0,但长度为9位数”*嗯。通常公牛和奶牛游戏的前提条件之一是,在秘密数字中,所有数字都是不同的。如果一个数字可能出现一次以上(如果秘密是'1123',我猜1561',它是一头,两头还是三头奶牛?),如何计算奶牛的数量并不十分清楚。但是如果你只有两个数字和9个位置,就没有办法避免重复。 –

+0

我知道,但这是我分配的。我能想到克服这个问题的唯一方法就是有一种方法只计算一次数字 –

回答

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; 
0

首先一个问题:因为你的游戏只有0和1的作品,是不是下面的是真的吗?

  1. 如果0不是公牛,并且解决方案至少包含一个0,那么它肯定是一头牛;
  2. 如果1不是公牛,并且解决方案至少包含1个1,那么它必定是母牛。

这可以给你一个更简单的解决方案。

无论如何,让我们想一个更一般的情况下,你不限于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()应该有类似的参数。如果出现guess[pos]中的值,只需检查solution中的所有位置。它可能会涉及这样的事情:

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

我希望你能明白我在这里试着去哪里。我真的不想破坏你的乐趣/学习过程,所以我会离开“DO SOMETHING”为你完成。但是,如果您有任何疑问,只需放下评论,我会尽力回答。

我想说的一件事是:如果你确定它不是公牛,那么只需确认猜测中的某个位置是否是牛。它会真正简化你的思考过程。