1

私はC++が初めてで、文字列のすべての順列のリストを生成するプログラムに取り組んでいますが、出力の長さを5文字に制限する機能が必要です(これはおそらくユーザーによって設定された変数)。私はこのようなものを約 1 週間探していましたが、最も近いものは次のコードです。

ソース.cpp:

#include <iostream>;

using namespace std;

void swap(char *fir, char *sec)
{
  char temp = *fir;
  *fir = *sec;
  *sec = temp;
}

/* arr is the string, curr is the current index to start permutation from and size is sizeof the arr */
void permutation(char * arr, int curr, int size)
{
  if(curr == size-1)
  {
    for(int a=0; a<size; a++)
        cout << arr[a] << "";
    cout << endl;
  }

  else
  {
    for(int i=curr; i<size; i++)
    {
        swap(&arr[curr], &arr[i]);
        permutation(arr, curr+1, size);
        swap(&arr[curr], &arr[i]);
    }
  }
}

int main()
{
  string next;
  char str[] = "abcdefghijklmnopqrstuvwxyz1234567890-";

  permutation(str, 0, sizeof(str)-1);
  cin.get();
  cin.get();
}

このコードは機能しますが、出力の長さは制限されません。出力の長さを指定された文字列の長さに設定します。また、出力内の同じ文字/数字の複数を説明していないようです (これは 100% 確実ではありません)。

さらに、ハイフンを出力の最初または最後の文字にすることはできないなど、特別なルールを設定する必要があります。

sizeof(str)-15に置き換えて上記のコードを変更しようとしましたが、文字列の最初の 5 文字だけを「ループ」するため、「e」を超えるものは処理されません。

誰かがこれを手伝ってくれるなら、それは大歓迎です。

編集:

他の誰かが同じことをしようとしている場合に備えて、最終製品を投稿するつもりです。

最終ソース:

#include <iostream>
#include <string>
#include <sstream>
#include <fstream>

using namespace std;

void swap(char *fir, char *sec)
{
  char temp = *fir;
  *fir = *sec;
  *sec = temp;
}

void permutation(char * arr, int size, char* result, int depth, int limit)
{
  ofstream myfile ("permutation.txt", fstream::app);
  if(depth == limit)
  {
    for(int a=0; a<limit; a++){
      myfile << result[a] << "";
      cout << result[a] << "";
    }
    myfile << "\n";
    cout << endl;
  }
  else
  {
    for(int i=0; i<size; i++)
    {
      result[depth] = arr[i];
      permutation(arr, size, result, depth + 1, limit);
    }
  }
  myfile.close();
}

int main()
{
  ofstream myfile ("permutation.txt");
  myfile << "";
  myfile.close();
  string answer;
  char *rArray;
  string startProcess = "N";
  std::cout << "Welcome to permutation v1" << endl;
  std::cout << "-------------------------" << endl;
  std::cout << "Please enter how long the string should be: ";
  std::getline (std::cin,answer);
  int result = atoi(answer.c_str());
  rArray = new char[result];
  std::cout << "\n\nThank You!\n" << endl;
  std::cout << "Please wait, generating possible character array for length of " << result << "." << endl;
  std::cout << "Would you like to proceed? Y = yes & N = no: ";
  std::getline (std::cin,startProcess);
  char str[] = "abcdefghijklmnopqrstuvwxyz1234567890";
  if(startProcess == "Y")
  {
    permutation(str, sizeof(str)-1, rArray, 0, result); 
  }
  else
  {
    std::cout << "\n\nOperation Terminated. No permutations being generated..." << endl;
  }
  cin.get();
  return EXIT_SUCCESS;
}
4

2 に答える 2

0

これは実際には難しい仕事ではありません。その関数内で再帰とループを使用できる場合は、それを解決できます。next_permutation標準ライブラリの関数を使用することをお勧めします。

事実は時間です。3 秒以内に、わずか 8 文字の順列を処理できます。そして、条件は要件に依存します。あなたの例で、開始または終了でハイフンを省略する必要がある場合は、プルーニングバックできるとします。

私の実装の疑似コード:

    char array[] = "abcdee";
    char eachPerm[6];
    bool usedmatrix[6][6];
    Recur(int depth, int n)
    {
       // you can return from here if this is not the right path, suppose '-'
       // in first or last place.
       if(depth == n)
       {
          print;
       }
       else
       {
          int i;
          for(i= 0 to array.length)
          {
               if(array[i] is not used before)
               eachPerm[depth] = array[i];
               recur(depth+1, n);
          }
       }
    }

最初にこの関数を呼び出しますrecur(0, 5)

于 2013-04-17T09:20:23.580 に答える