0

私がこれまでに持っているのはこれです:

#include <iostream>
#include <algorithm>

using namespace std;

int main(){

    string genePool[16] = {"aa", "ab", "ac", "ad", "ba", "bb", "bc", "bd", "ca", "cb", 
                       "cc", "cd", "da", "db", "dc", "dd"};

    string coco, code, deco, dede;

    int total = 0;

    for (int i = 0; i < 16; i++){
        coco = genePool[i];
        for (int j = 0; j < 15; j++){
            code = genePool[j];
                 for (int k = 0; k < 14; k++){
                 code = genePool[k];
                      for (int l = 0; l < 13; l++){
                      code = genePool[l];

                      size_t a = count(coco.begin(), coco.end(), 'a') +
                                 count(code.begin(), code.end(), 'a') +
                                 count(deco.begin(), deco.end(), 'a') +
                                 count(dede.begin(), dede.end(), 'a');
                      size_t b = count(coco.begin(), coco.end(), 'b') +
                                 count(code.begin(), code.end(), 'b') +
                                 count(deco.begin(), deco.end(), 'b') +
                                 count(dede.begin(), dede.end(), 'b');
                      size_t c = count(coco.begin(), coco.end(), 'c') +
                                 count(code.begin(), code.end(), 'c') +
                                 count(deco.begin(), deco.end(), 'c') +
                                 count(dede.begin(), dede.end(), 'c');
                      size_t d = count(coco.begin(), coco.end(), 'd') +
                                 count(code.begin(), code.end(), 'd') +
                                 count(deco.begin(), deco.end(), 'd') +
                                 count(dede.begin(), dede.end(), 'd');

                        if (a = 2 || b = 2 || and c = 2 || d = 2){
                           total++;
                           cout << total << ") "coco << "," << code << "," << deco 
                                << "," << dede << endl;
                        }
                      }    
                }
        }
    }
    return 0;
}

私が c++ で何かをしてからしばらく経ちましたが、それでもまだそれほど進んでいませんでした。より良いことが指摘されるたびに、私は義務的により良くします:)

4

3 に答える 3

1

では、それぞれ 4 文字の 2 つのインスタンスを含む 8 文字 (4 スポット x スポットあたり 2 文字) のシーケンスが必要ですか?

"aabbccdd"8文字すべてを選択しているため、実際には の可能なすべての順列が必要なようです。

したがって、これはすべての順列を出力します。

#include <string>
#include <algorithm>
#include <iostream>

void print_permutations(const char *source)
{
    // current permutation
    std::string s(source);
    // this must start off sorted
    std::sort(s.begin(), s.end());
    do {
        std::cout << s << '\n';
    } while (std::next_permutation(s.begin(), s.end()));
}

// original gene pool
const char *pool = "aabbccdd";

int main()
{
    print_permutations(pool);
}

これは基本的にここの例です

これが探しているものではない場合、サンプル出力を表示できますか?

于 2013-01-18T08:01:04.157 に答える
0

私はグラフのアプローチを取ります。ジーンプールの各要素がノードで表されるグラフを作成し、エッジとの可能なペアリングをそれぞれ作成します。

少し縮小すると、このようになります。

\#include "iostream"

\#include "string"

\#include "algorithm"

\#include "map"

using namespace std;

using namespace std;

int main(){

string genePool[16] = {"aa", "ab", "ac", "ad", "ba", "bb", "bc", "bd", "ca", "cb",
                   "cc", "cd", "da", "db", "dc", "dd"};


map< string,map< string,bool > * > Graph;

for(int i=0;i < 16;++i){

Graph[genePool[i]]= new map< string,bool>;

    for(int j=0;j < 16;++j){

    string combined = genePool[i]+genePool[j];

    unsigned found;

    int count_a =count(combined.begin(),combined.end(),'a');

    int count_b =count(combined.begin(),combined.end(),'b');

    int count_c =count(combined.begin(),combined.end(),'c');

    int count_d =count(combined.begin(),combined.end(),'d');

    if( (count_a == 2 ||count_a ==0)   && (count_b == 2 ||count_b ==0)  && (count_c == 2             ||count_c ==0) && (count_d == 2 ||count_d ==0))

    (*Graph[genePool[i]])[genePool[j]] = true;

    }

}

map<string,map<string,bool>* >::iterator it1 =Graph.begin();

while(it1 != Graph.end() ){

    map<string,bool>::iterator it2 =it1->second->begin();

    while(it2 != it1->second->end()){

        cout <<it1->first<<it2->first<<endl;

        ++it2;

    }

   ++it1;

}


}
于 2013-01-18T10:30:57.950 に答える
0

4文字のうち2文字を選択して、それぞれ2回含まれる長さ4のシーケンスを作成したいと思われますか?

私の(非常に失礼な)アプローチは次のようになります。最初から最後まで、文字ごとにシーケンスに追加し、すべてのステップでルールに従って可能なソリューションを絞り込みます。

これにより、次のようなものが作成されます。

aabb, abba, baba, abab an so on

一部の行のコメントを外して、アトミック ペアのみを許可することができます。これは、最初の 2 文字の後に行われ、それに応じて 2 番目のペアを追加します。(コード内のコメントを参照)

aabb, abab, baba, bbaa ....

ここにいくつかのコードがあります:

#include <vector>
using namespace std,

// .....

string letters = "abcd", tmpStr;
string wrkString; // string to hold sequence during creation
<vector>string sequences; // vector to hold all valid sequences

for(int first=0;i<letters.length();first++){ // every char as first char
    wrkString = letters.at(first);
    for(int  second=0;i<letters.length();second++){ // every char as second char
        wrkString += letters.at(second);
        // got first 2 now differentiate
        if(first == second) // having aa
            letters.erase(first,1); // if same twice, erase from possible elements
        else{ // having ab
            tmpStr = letters;  // if different only this two remain possible solutions
            letters = tmpStr.at(first) + tmpStr.at(second);   

            // uncomment here to add this pair again in same order (ab ab)
            // wrkString += wrkString;
            // sequences.push_back(wrkString);  
            // letters = '';        
        }
        for(int third=0;i<letters.length();third++){ // having aa or ab or ba or bb or ac ...
            wrkString += letters.at(third);
            if(wrkString.find(letters.at(third))==1) // having aac
               letters = letters.at(third);  // if included it has to be added once more
            else // having acc 
               letters -= letters.at(third); // if included twice, remove from possible elements

            for(int fourth=0;i<letters.length();fourth++){ // here allways 1 letter left
                wrkString += letters.at(fourth);
                sequences.push_back(wrkString);    // adding copy of sequence to vector
            }
        }
    }
    letters = "abcd"; // reset possible elements for next iteration
}
于 2013-01-18T07:49:29.000 に答える