2017-01-02 98 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」爲你完成。但是,如果您有任何疑問,只需放下評論,我會盡力回答。

我想說的一件事是:如果你確定它不是公牛,那麼只需確認猜測中的某個位置是否是牛。它會真正簡化你的思考過程。