好きな和訳タイトルを教えてください

1から4までの数字の順列をすべて印刷するプログラムを作りたいのですが、
ちょっとてこずっています。上級者から見れば簡単だと思います。
1234
1243
1324
1342
1423
1432 
  ・
  ・
  ・  というプログラムです。
誰か教えていただけないでしょうか。お願いします。

A 回答 (3件)

 「直ぐに回答がほしい」にマークしつつ、5日経っても回答に何の補足もお礼もないというのは、どうなんでしょう。

(最低限のマナーは守りましょう。)

 一応未解決と解釈して、下記2件の4重ループとは異なる、他の順列にも適用できるプログラムを挙げます。
 全部ループでやるのは面倒なので再帰を使ってます。(一応補足ですが、ループで実現できない再帰はありません)

#include <stdio.h>

void permu(int n, int r, int *a, int m, int b);
void let_permu(int r, int *p);

int main(void)
{
  int a[32], n, r;
  scanf("%d", &n);
  if (n < 1 || 32 < n) return 0;
  scanf("%d", &r);
  if (r < 1 || n < r) return 0;
  permu(n, r, a, 0, 0);
  return 0;
}

void permu(int n, int r, int *a, int m, int b)
{
  int i;
  if (r == m) {
    let_permu(r, a);
    return;
  }
  for (i = 0; i < n; i++) {
    if (!(b & (1 << i))) {
      a[m] = i + 1;
      permu(n, r, a, m+1, b|(1<<i));
    }
  }
}

void let_permu(int r, int *p)
{
  int i;
  for (i = 0; i < r; i++)
    printf("%d%c", p[i], (i+1<r ? '-' : '\n'));
}

∇解説
・n個からr個を選んで並べる順列を、すべて求めます。
・最初に入力を求められる n には、全体の数を入力します。
・次に入力を求められる r には、その中から幾つ選ぶかを入力します。
・32までの順列は作れるようになっています。(が、せいぜい10までぐらいにしないと、相当時間がかかります)

・関数permuのforループで、階層mの値を求めます。
・b はバイナリフラグで、i ビット目が0の時のみ処理を行います。
・求めた値 i+1を、a[m]に格納します。
・次の階層m+1と、a[m]ビット目を1にしたフラグをパラメータにセットし、関数permuを呼び出します。これ以外のパラメータは、同じ値を使い回します。
 これの繰り返しで順列を求めることが出来ます。
・順列が1つ求まるたびに let_permu 関数が呼ばれるので、そこでバッファにためるなり、印刷するなりの処理を行ってください。(ここでは単純に表示しています)
・表示上の都合で、全角スペースを使っています。コピペした際は半角へ変換してください。
    • good
    • 0
この回答へのお礼

詳しく説明してもらってありがとうございます。参考になりました。
ところで、4重ループを使ったプログラムはどのようなものなのでしょうか?
もし教えていただけるなら幸いです。

お礼日時:2001/07/02 02:51

考え方


配列をつかう。
4重ループ
それぞれのループでは、配列にマークされてない
数字をえらぶ。
そして、そのループで使用した数字の配列にマーク
(一番そのループは配列サーチはいらない)

っていうのはどうでしょ。
    • good
    • 0

簡単にやり方だけ。



(1)4重ループを作って、4桁にそれぞれ1~4を突っ込む。
(2)各桁の掛けた合計が24であったら、その値を保存。(24になる場合は常に1,2,3,4の組み合わせ)
(3)最後に全部を並べて印刷

これで良いんじゃないでしょうか?(1~4の組み合わせ限定的なものがあるので、実用的ではありませんが・・・)

私に勘違いがあったら申し訳ありません。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報