C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

すべての順列をC++で並べ替えられた(辞書式)順序で出力します


この問題では、長さnの文字列が与えられ、文字列の文字のすべての順列をソートされた順序で出力する必要があります。

問題を理解するために例を見てみましょう:

入力: 「XYZ」

出力: XYZ、XZY、YXZ、YZX、ZXY、ZYX。

ここでは、すべての順列を辞書式順序(アルファベット順)で印刷する必要があります。

この問題を解決するには、最初に配列をアルファベット順に並べ替える必要があります。並べ替えられた配列は、順列の最初の要素です。次に、文字列の次に高い順序の順列を生成します。

以下のコードは、解決策をより明確にします:

#include<iostream>
#include<string.h>
using namespace std;
int compare(const void *a, const void * b){
   return ( *(char *)a - *(char *)b );
}
void swap(char* a, char* b) {
   char t = *a;
   *a = *b;
   *b = t;
}
int finduBound(char str[], char first, int l, int h) {
   int ubound = l;
   for (int i = l+1; i <= h; i++)
      if (str[i] > first && str[i] < str[ubound])
   ubound = i;
   return ubound;
}
void generatePermutaion ( char str[] ) {
   int size = strlen(str);
   qsort( str, size, sizeof( str[0] ), compare );
   bool isFinished = false;
   while ( ! isFinished ) {
      cout<<str<<"\t";
      int i;
      for ( i = size - 2; i >= 0; --i )
         if (str[i] < str[i+1])
            break;
         if ( i == -1 )
            isFinished = true;
      else {
         int ubound = finduBound( str, str[i], i + 1, size - 1 );
         swap( &str[i], &str[ubound] );
         qsort( str + i + 1, size - i - 1, sizeof(str[0]), compare );
      }
   }
}
int main() {
   char str[] = "NOPQ";
   cout<<"Permutation in Sorted order :\n";
   generatePermutaion(str);
   return 0;
}

出力

Permutation in Sorted order :
NOPQ NOQP NPOQ NPQO NQOP NQPO
ONPQ ONQP OPNQ OPQN OQNP
OQPN PNOQ PNQO PONQ POQN
PQNO PQON QNOP QNPO QONP
QOPN QPNO QPON

  1. すべてのサイクルをC++の無向グラフに出力します

    この問題では、無向グラフが与えられ、グラフに形成されるすべてのサイクルを印刷する必要があります。 無向グラフ 互いに接続されたグラフです。一方向グラフのすべてのエッジは双方向です。無向ネットワークとも呼ばれます。 サイクル グラフのデータ構造は、すべての頂点がサイクルを形成するグラフです。 問題をよりよく理解するための例を見てみましょう- グラフ- 出力- Cycle 1: 2 3 4 5 Cycle 2: 6 7 8 このために、グラフのいくつかのプロパティを利用します。グラフ彩色法を使用して、閉路グラフで発生するすべての頂点に色を付ける必要があります。また、頂点

  2. バイナリツリーレベルをC++でソートされた順序で出力します

    この問題では、二分木が与えられ、すべてのノードを値の並べ替えられた順序でレベルで出力する必要があります。 概念をよりよく理解するために例を見てみましょう。 入力 − 出力 − 20 6 15 2 17 32 78 この問題を解決するには、ツリーの各レベルのソートされた順序を印刷する必要があります。このために、キューと2つの優先キューを作成する必要があります。 NULLセパレータは、2つのレベルを分離するために使用されます。 例 論理を説明するプログラム- #include <iostream> #include <queue> #include <