指定された長さのすべてのシーケンスをC++で出力します
この問題では、2つの整数値kとnが与えられます。そして、1からnまでの数字から長さkのすべてのシーケンスをソートされた順序で印刷する必要があります。
トピックを理解するために例を見てみましょう-
Input:k = 2 ; n = 3 Output: 1 1 1 2 1 3 2 1 2 2 2 3 3 1 3 2 3 3
したがって、この問題では、上記のようにシーケンスを印刷する必要があります。
この問題を解決する簡単な方法は、シーケンスの整数を最大値、つまりnに達するまでインクリメントすることです。以下は、ソリューションの詳細な説明です。
アルゴリズム
1) Create an array of size k with all values = 1 i.e. {1, 1, ..ktimes}. 2) Repeat step 3 and 4 till the array becomes {n, n, …, n}. 3) Print the array. 4) Increment the value such that the elements of the array become the next value. For example, {1, 1, 1} incremented to {1, 1, 2} and {1, 3, 3} incremented to {2, 1, 1}. For this we need to check the kth element of the array, if it’s equal to n become update, then check k-1 element in the sequence and so on for the same condition.
例
次のプログラムは、概念をより明確にします。
#include<iostream> using namespace std; void printSequence(int arr[], int size){ for(int i = 0; i < size; i++) cout<<arr[i]<<"\t"; cout<<endl; return; } int nextElement(int arr[], int k, int n){ int s = k - 1; while (arr[s] == n) s--; if (s < 0) return 0; arr[s] = arr[s] + 1; for(int i = s + 1; i < k; i++) arr[i] = 1; return 1; } void generateSequence(int n, int k){ int *arr = new int[k]; for(int i = 0; i < k; i++) arr[i] = 1; while(1){ printSequence(arr, k); if(nextElement(arr, k, n) == 0) break; } return; } int main(){ int n = 3; int k = 2; cout<<"The sequence is :\n"; generateSequence(n, k); return 0; }
出力
シーケンスは-
です1 1 1 2 1 3 2 1 2 2 2 3 3 1 3 2 3 3
この方法は理解しやすいですが、より良く、より効率的にすることができます。
このメソッドは、再帰と追加のインデックスを使用して、シーケンスオフセット(シーケンスが反転される後の値)をチェックします。関数は再帰的に呼び出され、インデックスが作成されるまで用語を更新しません。そして、インデックスの後に次の用語のために関数を回復します。
例
#include<iostream> using namespace std; void printSequence (int arr[], int size){ for (int i = 0; i < size; i++) cout << arr[i] << "\t"; cout << endl; return; } void generateSequence (int arr[], int n, int k, int index){ int i; if (k == 0){ printSequence (arr, index); } if (k > 0){ for (i = 1; i <= n; ++i){ arr[index] = i; generateSequence (arr, n, k - 1, index + 1); } } } int main (){ int n = 3; int k = 2; int *arr = new int[k]; cout<<"The sequence is:\n"; generateSequence (arr, n, k, 0); return 0; }
出力
シーケンスは-
です1 1 1 2 1 3 2 1 2 2 2 3 3 1 3 2 3 3
-
C++で特定のノードから距離kにあるすべてのノードを出力します
この問題では、二分木、ターゲットノード、整数Kが与えられます。ターゲットノードから距離Kにあるツリーのすべてのノードを印刷する必要があります。 。 二分木 は、各ノードに最大2つのノード(1つまたは2つ/なし)を持つ特別なツリーです。 問題を理解するために例を見てみましょう K =2 ターゲットノード:9 出力 − 5 1 3. 説明 − 距離は、ノードの上位、下位、または同じレベルで取得できます。したがって、それに応じてノードを返します。 この問題を解決するには、ターゲットノードからK距離離れたノードのタイプを理解する必要があります。 上記の試験から、k個の離
-
特定のソースから宛先までのすべてのパスをC++で出力します
この問題では、有向グラフが与えられ、グラフのソースから宛先までのすべてのパスを印刷する必要があります。 有向グラフ は、頂点aからbに向けられたエッジを持つグラフです。 問題を理解するために例を見てみましょう ソース=K宛先=P 出力: K -> T -> Y -> A -> P K -> T -> Y -> P K -> A -> P ここで、KからPへのパスを見つけました。パスをトラバースし、KからPに向かうすべてのパスを出力しました。 この問題を解決するために、深さ優先探索を使用してグラフをトラバースします。