2016-08-18 74 views
-2
#include <iostream> 

using namespace std; 

int main() 
{ 
    cout << "starting program" << endl; 
    for (int a=1; a<10; a++) 
    { 
     for (int b=1; b<10; b++) 
     { 
     for (int c=1; c<10; c++) 
     { 
     for (int d=1; d<10; d++) 
     { 
     for (int e=1; e<10; e++) 
     { 
     for (int f=1; f<10; f++) 
     { 
     for (int g=1; g<10; g++) 
     { 
     for (int h=1; h<10; h++) 
     { 
     for (int i=1; i<10; i++) 
     if (a+(13 * b/c) +d +(12 * e)- f - 11 + (g * h/i) - 10 == 66) 
     { 
      cout << a << b << c << d << e << f << g << h << i << endl ; 
     } 
    } 
    } 
    } 
    } 
    } 
    } 
    } 
    } 
    return 0; 
} 

因此,我找到了代碼1和9之間的所有可能組合,以查看哪一個可以解決方程,正如您所看到的,我有9個變量。檢查一個組變量在if語句條件下是否彼此相等

這個方程式可以用許多不同的組合來解決,但是我的目標是讓變量不相等。當然,我可以通過寫入if聲明條件中的每一個條件來解決這個問題,但這將會導致81條件,這是很多和愚蠢的。有沒有辦法以更聰明的方式來解決這個問題?順便說一下,我是初學者,所以如果你有任何先進的方法提供,請簡要解釋一下。

+0

如果你檢查變量是否能解出方程,爲什麼不把它們填入方程中,並檢查結果是否是你想要的? – rubenvb

+0

這個問題可以通過回溯來輕鬆解決。我的建議是等到你到達那個課程或者自己去學習回溯。除此之外,你現在可以做的事情不多。 – bolov

+1

btw。我喜歡你,因爲你縮進了第一個2'',然後你就像「啊......這個「 – bolov

回答

2

正如@n.m所述。在評論中,因爲所有的變量必須是不同的,你正在尋找排列範圍的1 1到9這是因爲C++已經爲您提供了std::next_permutation將產生排列爲您帶來:

// Array for your variables, vars[0] is a, vars[1] is b, and so on... 
std::array<int, 9> vars; 

// Fill the array from number from 1 to 9 (so a = 1, b = 2, and so on...) 
std::iota(std::begin(vars), std::end(vars), 1); 

// Loop through all permutations of this array (see std::next_permutation): 
// 1 2 3 4 5 6 7 8 9 
// 1 2 3 4 5 6 7 9 8 
// 1 2 3 4 5 6 8 7 9 
// ... 
// 9 8 7 6 5 4 3 2 1 
do { 
    // Check if the variables matches what you want (see below for check): 
    if (check(vars)) { 
     std::cout << "Solution found: "; 
     for (auto v: vars) 
      std::cout << v << ' '; 
     std::cout << '\n'; 
    } 
} while(std::next_permutation(std::begin(vars), std::end(vars))); 

其中check是,例如:

int check(std::array<int, 9> const& vars) { 
    // Remember that vars[0] is a, vars[1] is b, ..., I rewrote your comparison as: 
    // c * i * (a + d + 12 * e - f - 11 -10) + 13 * b * i + c * g * h == 66 * c * i 
    // ...in order to avoid division. 
    return vars[2] * vars[8] * (vars[0] + vars[3] + 12 * vars[4] - vars[5] - 11 - 10) 
     + (13 * vars[1] * vars[8]) 
     + (vars[2] * vars[6] * vars[7]) == 66 * vars[2] * vars[8]; 
} 

還有其他的方法來找到你的解決方案:你可以降低你打算使用已經影響變量的值(例如,指派下一個變量的域,有沒有必要循環最後一個變量,因爲最後只有零個或一個可能的值),但是這更復雜,可能是你想要做的事情的矯枉過正。如果您想了解更多關於這一點,你可以尋找constraint programming

我重新組織的計算,因爲你在做整數除法其截斷的結果,所以你可以得到不正確的解決方案。


關於代碼的一些細節你可能不熟悉,作爲一個初學者:

  • std::array<int, 9>(C++ 11)是一個靜態數組,取代int vars[9],你應該更喜歡使用這種過度只要可以,就可以使用c-style數組。
  • std::iota距離<algorithm>報頭中的功能,將填補範圍std::begin(vars)std::end(vars)與起始1(作爲最後一個參數中提供的值)增加的值。
  • for (auto x: vars)是一個range-based for loop(自C++ 11以來可用),它允許您以簡單的方式遍歷任何容器。
相關問題