質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

3回答

3233閲覧

全ての組み合わせを求めるプログラム

do31

総合スコア45

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2020/03/22 06:25

編集2020/03/22 06:26

書きたいこと

全ての組み合わせを求めるプログラムが書きたいのですが
どのように書けばよいのでしょうか。

入力:何パターンあるかの数値
出力:すべての組み合わせを出力
以下例
入力:3
出力:
0 1 2
0 2 1
1 2 0
1 0 2
2 0 1
2 1 0

static void Test(int count) { for (int i = 0; i < count; i++) { string str = i.ToString(); for (int n = i + 1; n < count; n++) { str += n.ToString(); } Debug.Print("{0}", str); } }

上記コードにTest(3);とした場合の出力は以下のとおりです。
012
12
2
求められる行数はcount!のはずで
for (int n...の中にDebug.Printが来るはずなのですが
どのように書けばよいのでしょうか。

よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2020/03/22 08:21

慣れないうちはループより再帰の方が作りやすいと思います。
guest

回答3

0

ベストアンサー

とりあえず内容が簡単なアルゴリズムを考えてみればどうでしょうか.

例えば,入力が3であるとき,
「3進法で3桁の数を全て列挙するとき,その過程で,全ての桁の値が異なるものだけを出力する」
ならば,結果として

すべての組み合わせを出力

になりませんか.


↑の話を愚直に書いてみました.

C#

1//Lの要素が重複していなければ表示する 2static void TestAndOutput( int[] L ) 3{ 4 var C = new bool[ L.Count() ]; //all false 5 foreach( int v in L ) 6 { 7 if( C[v] )return; 8 C[v] = true; 9 } 10 foreach( int v in L ){ Console.Write( " {0}",v ); } 11 Console.WriteLine(); 12} 13 14//kが入力値. 15static void OutputAllCombination( int k ) 16{ 17 var L = new int[k]; //all 0 18 while( true ) 19 { 20 TestAndOutput( L ); 21 22 int p = 0; 23 while( true ) 24 { 25 if( L[p]+1<k ) 26 { ++L[p]; break; } 27 else 28 { 29 L[p] = 0; 30 ++p; 31 if( p == k )return; 32 } 33 } 34 } 35} 36 37//Main 38static void Main(string[] args) 39{ 40 OutputAllCombination(3); 41 Console.Read(); 42}

投稿2020/03/22 07:02

編集2020/03/23 01:51
fana

総合スコア11708

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ありがとうございます。
再帰の方法は難しかったので、以下のようなコードを書きました。
Test2がcount分ループしているのとif文が多いため効率で言えばかなり悪い気がしています。
何か良い方法ないでしょうか。

static void Test(int count) { List<int> list = new List<int>(); for (int i = 0; i < count; i++) { for (int n = 0; n < count - 1; n++) { list.Clear(); list.Add(i); Test2(count, list, (i + n + 1)); Debug.Print("{0}", string.Join(" ", list)); } } } static void Test2(int count, List<int> list, int index) { for (int x = 0; x < count; x++) { if (count <= index) index -= count; if (!list.Contains(index)) list.Add(index); index++; } }

投稿2020/03/22 08:37

編集2020/03/22 08:40
do31

総合スコア45

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

まず、自分が手でこれを出す場合にどうするのかを考えます

それがわかれば、後はその手順で出すようにコードに書いていけばいいです

投稿2020/03/22 08:19

y_waiwai

総合スコア87800

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問