2017-12-20 12 views
0

私は作成しているゲームのためのすべての可能な解決策を作成する関数を作成しました...多分あなたの一部はブルコウゲームを知っています。ベクトルの問題、私のベクトルの配列を削除する方法?

最初に、最大4つの整数の組み合わせを作成する関数を作成しましたが、その中に繰り返し数を含めることはできません... '1234'は解決策ですが '1223' '2'は数字で繰り返されているからです。合計で、数字を繰り返さない「0123」と「9999」の間には5040の数字があります。ここで

は私の機能である:

std::vector <std::array<unsigned, 4>> HittaAllaLosningar(){ 
    std::vector <std::array<unsigned, 4>> Losningar; 
    for (unsigned i = 0; i < 10; i++) { 
    for (unsigned j = 0; j < 10; j++) { 
     for (unsigned k = 0; k < 10; k++) { 
     for (unsigned l = 0; l < 10; l++) { 
      if (i != j && i != k && i != l && j != k && j != l && k != l) { 
       Losningar.push_back({i,j,k,l}); 
      } 
     } 
     } 
    } 
    } 
    return Losningar; 
} 

今度は、私は数「1234」を持っているとしましょう、それは私が見つけることを試みているソリューションではありません、私は配列からソリューション「1234」を削除したいですそれは解決策ではないので...どうすればいいのですか?何時間も見つけようとしていて、それを見つけることができません。私はvector.eraseを試しましたが、私はunsignedについての間違いをしています...また、その推測が言及する価値は文字列にあります。

私がしようとしているのは、自分のプログラムから得た文字列を取得することです。それが解決できない場合は、vectorに存在する場合はベクターから削除します。ここで

は推測を作成するコードは次のとおりです。

std::string Gissning(){ 
    int random = RandomGen(); 
    int a = 0; 
    int b = 0; 
    int c = 0; 
    int d = 0; 

    for (unsigned i = random-1; i < random; i++) { 
     for (unsigned j = 0; j < 4; j++) { 
     if (j == 0) { 
      a = v[i][j]; 
     } 
     if (j == 1) { 
      b = v[i][j]; 
     } 
     if (j == 2) { 
      c = v[i][j]; 
     } 
     if (j == 3) { 
      d = v[i][j]; 
     } 
     } 
     std::cout << std::endl; 
     AntalTry++; 
    } 
std::ostringstream test; 
test << a << b << c << d; 
funka = test.str(); 

return funka; 
} 

randomgen機能は、私は、ベクトルの要素を取ることができますので、私は乱数を得ることができ、その後、私はループに行くだけの機能です次に配列の整数を取得します。

私を助けるために時間をとってくれてありがとう、私は非常に感謝しています!

+0

あなたはあなたのGissning機能を簡素化することができませんん真ん中を削除するには? (符号なしi =ランダム-1; i <ランダム; i ++) { a = v [i] [0]; b = v [i] [1]; c = v [i] [2]; d = v [i] [3]; std :: cout << std :: endl; AntalTry ++; } – Morgan

答えて

0

あなたは準備ができて他の機能を持っている場合、これは非常に単純です:

using TestNumber = std::array<unsigned, 4>; 

struct TestResult { 
    int bulls; 
    int cows; 
} 

// function which is used to calculate bulls and cows for given secred and guess 
TestResult TestSecretGuess(const TestNumber& secret, 
          const TestNumber& guess) 
{ 
    // do it your self 
    … … … 
    return result; 
} 

void RemoveNotMatchingSolutions(const TestNumber& guess, TestResult result) 
{ 
    auto iter = 
    std::remove_if(possibleSolutions.begin(), 
        possibleSolutions.end(), 
        [&guess, result](const TestNumber& possibility) 
        { 
         return result == TestSecretGuess(possibility, guess); 
        }); 
    possibleSolutions.erase(iter, possibleSolutions.end()); 
} 

免責事項:パフォーマンスを向上させることが可能である(あなたは要素の順序を気にしないでください)。そのように、あなただけの消去を使用して、それにイテレータを与える必要がベクターから消去する

2

消去する要素の位置を見つける必要があります。

std::array<unsigned, 4> needle{1, 2, 3, 4}; 
auto it = std::find(Losningar.begin(), Losningar.end(), needle); 
if (it != Losningar.end()) { Losningar.erase(it); } 

あなたが一致するすべての値を削除したい、またはあなたがendに対してチェックを気に入らない場合、あなたはstd::removeと消去の2つのイテレータのオーバーロードを使用することができます。これは「消去消去」イディオムとして知られています。

std::array<unsigned, 4> needle{1, 2, 3, 4}; 
Losningar.erase(std::remove(Losningar.begin(), Losningar.end(), needle), Losningar.end()); 
+0

私はそれを正しく理解しているかどうかを見てみましょう... 私のベクトルからコンピュータの推測を削除する場合は、2番目のコードを使用する必要があります...しかし、私は4つの数字を持つ文字列を持って、そのコードを使用してください。その文字列は私のベクトルでも確実です... また、Losingarは一般的なスコープで宣言されていないので問題が発生します... losningarはソリューションを作成する関数でのみ宣言されます –

+0

重要なのは2行目です2番目のコードの – Morgan

+0

ベクトルの名前が何であっても、それを使って、私はちょうど 'Losingar'を推測しました。値 'needle'はあなたが削除したいものです – Caleth

0

:それが指していた要素が削除されているので、

std::vector<std::array<unsigned, 4>> vec; 
vec.push_back({1,2,3,4}); 
vec.push_back({4,3,2,1}); 

auto it = vec.begin(); //Get an iterator to first elements 
it++; //Increment iterator, it now points at second element 
it = vec.erase(it); // This erases the {4,3,2,1} array 

をあなたは要素を消去した後、それが無効です。 Tiはイテレータを引き続き使用し続け、イテレータからの戻り値を取ることができます。有効なイテレータは、消去された次の要素の次の要素までです。

しかし、内部的にどのように動作するかによって、ベクトルの途中の要素を削除することはあまり効率的ではありません。異なるソリューションがどのような順序で格納されているかが重要でない場合は、小さなトリックが簡単になり、コードを高速化できます。これがあるとしましょう。

std::vector<std::array<unsigned, 4>> vec; 
vec.push_back({1,2,3,4}); 
vec.push_back({4,3,2,1}); 
vec.push_back({3,2,1,4}); 

たちは、あなたが

vec[1] = vec.back(); // Replace the value we want to delete 
// with the value in the last element of the vector. 
vec.pop_back(); //Remove the last element 
関連する問題