2013-10-30 108 views
1

我已經給了一個'破解算法'來解決。它用於遊戲「猜測1-100之間的數字」計算機在7個問題/迭代內回答。猜數字遊戲

我給出的簡述表明只需對算法進行微小的更改,如果含糊不清,我就會想到同樣的事情。

無論如何,算法充滿了我已經清理過的愚蠢的錯誤。對於33的測試案例,該算法分配以下中值:

50,25,37,19 < < 19顯然是不正確的。

我知道last_median = current的中位數不在正確的位置。這是一個漫長的一天,如果任何人都可以擺脫這一點,我會很感激。

const int MAX_VALUE = 100; 
int current_median = MAX_VALUE /2; 
int last_median = 0; 

while (true) 
{ 
    last_median = current_median; 

    if(number >= current_median) 
    { 
     if(number == current_median) 
     { 
      //Check for equality 
      cout << endl << number << endl; 
      break; 
     } 

     current_median += last_median /2; 
    } 
    else if(number <= current_median) 
    { 
     if(number == current_median) 
     { 
      // Check for equality 
      cout<<endl<<number<<endl; 
      break; 
     } 

     current_median -= last_median /2; 
    } 
} 

回答

1

兩個提示:

  • 您可以將兩個if。外面的相等比較。
  • 你應該跟蹤你知道包含數字的範圍。一旦你這樣做,邏輯將非常簡單。
+0

歡呼你的時間。哈哈,我寫了「50,25,37,19 << 19顯然是不正確的。」存儲範圍跳出我的身邊。 –

1

該算法基本上是一個二分查找。你有一個問題是你的條件語句:

if(number >= current_median) 
// ... 
else if(number <= current_median) 
// ... 

如果number是平等的,你想退出循環,無法繼續它:

if(number > current_median) 
// ... 
else if(number < current_median) 
// ... 
else // we are equal 
{ 
    break; 
} 

你也應該調整自己的條件語句來檢查(low, high)範圍,因爲它應該(快速)隨着您的中值接近真實值而變小。

一個簡單的例子:

#include <iostream> 

int main() 
{ 
    std::cout << "Pick a number between [0, 100] (Don't tell me what it is!)"; 

    unsigned int low = 0; 
    unsigned int high = 100; 
    do 
    { 
     unsigned int median = (low + high)/2; 
     std::cout << "Is your number > " << median << "? "; 
     char answer; 
     std::cin >> answer; 
     if (answer == 'Y' || answer == 'y') 
     { 
      low = median; 
      continue; 
     } 
     else 
     { 
      std::cout << "Is your number < " << median << "? "; 
      std::cin >> answer; 
      if (answer == 'Y' || answer == 'y') 
      { 
       high = median; 
       continue; 
      } 
      else // we are equal 
      { 
       low = high = median; 
      } 
     } 

    } while (low != high); 

    std::cout << "Your number is " << low << std::endl; 
    return 0; 
} 
+0

if(number == current_median){cout << endl << number << endl; break;} –

+0

你不必要的複製。 –

1

如果您正在尋找0和100之間的數字,你會發現它在7個以下步驟。如果你想要更加精確,那麼如果你正在尋找一個奇數,那麼它恰好是7步,而在某些情況下,如果你正在尋找一個偶數,它將會是6或更少。我將在下面給出一個簡單的代碼。我並沒有把所有的檢查(輸入數字而不是字母,或其他的東西),它只是寫在一兩分鐘:

#include <iostream> 

int main(){ 

    std::cout << "Think of a number between 1 and 100" << std::endl ; 
    std::cout << "Press 0 if my number is correct. 1 if YOUR number is smaller. 2 if bigger" << std::endl; 

    int response = 0; 
    int middle = 64; 
    int low = 0; 
    int high = 128; 
    int counter = 1; 

    while(response!=0) 
    { 
     std::cout << counter << " Guess " << counter << ": " << middle << std::endl; 
     std::cout <<"Press 0(bingo) 1(smaller) 2(greater): " ; 
     std::cin >> response ; 
     std::cout << std::endl ; 
     counter++; 
     switch (response){ 
     case 0: 
      std::cout << "Your number is: " << middle << std::endl; 
      break; 

     case 1: 
      high = middle; 
      middle = (low+high)/2; 
      break; 

     case 2: 
      low = middle; 
      middle = (low+high)/2; 
      break; 

     } //end swhitch 

    }; //end while 


    return 0; 
} 
+1

也許我也應該提到,一般來說,解決問題的步驟數量等於2的最小次冪,大於間隔的「結束」。所以,如果你想要一個介於0和100之間的數字,找到下一個2的冪次數大於100,這是128,那麼在7次冪時= 2你的答案是7.如果你想要一個0到1000之間的數字,下一個2大於1000的功率是1024,這是在功率10時的2,所以答案是10. – DrM

+0

你對偶數和偶數的評論不太準確。如果使用二進制搜索,「最大」**步數爲7.這發生在接近「邊界」(例如1,99)的數字上。你可以很快得到一些奇數(例如25步和75步都可以在2步中找到)。 –

0
int main() 
{ 
char uput = '?'; 
int maxx = 100; 
int minn = 0; 

while (minn != maxx) 
{ 
    cout << (minn+maxx)/2 << ": [h]igher, [l]ower or [e]qual?"; 
    cin >> uput; 
    if (uput == 'l') 
    { 
     maxx = (minn+maxx)/2; 
    } 
    else if (uput == 'h') 
    { 
     minn = (minn+maxx)/2; 
    } 
    else if (uput == 'e') 
    { 
     cout << "Your number is " << (minn+maxx)/2 << ". Yay."; 
     return 0; 
    } 
} 
return 0; 
} 

如果數量比中位數低,中位數是新的最大值。

如果數量高於中位數,則中位數是新的最小值。

創建一個循環。對於循環中的每一次,找到minn和maxx之間的中值。由於您每次縮小最小值和最大值之間的差距,您最終只能以1種可能性到達,這就是您的號碼。

上面的代碼不是一個很好的例子,但希望它有助於說明。