ここから本文です

プログラムの相談になります。 同じものがある順列をパターン分作成するものを考...

bam********さん

2019/3/1811:04:37

プログラムの相談になります。
同じものがある順列をパターン分作成するものを考えています。

例:Aが3個、Bが3個、Cが4個 あった場合、組み合わせで出来る10文字を全て表記せよ


パターンの数は 10!/(3!3!4!)=4200であることは直ぐにわかっています。
また、一応自分が考えたのは
同じものとは考えず、A1,A2,A3,B1,B2,B3,C1,C2,C3,C4として、全てのパターンを表記するロジックを作成し、その時に既に同じパターン(数値部分を無くしてA,B,Cとして考え)のものを除去していくというものです。
これで、一応出来るとは思うのですが、美しさにかけると思い、もう少し綺麗な形がないかと悩んでいます。

何か、良い方法が無いか、お知恵を拝借願いたいです。

宜しくお願い致します。

この質問は、活躍中のチエリアン・専門家に回答をリクエストしました。

閲覧数:
82
回答数:
3
お礼:
500枚

違反報告

ベストアンサーに選ばれた回答

uso********さん

2019/3/2016:36:09

https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q112016395...
↑既出
VBScriptだけど、一応動くかと。

cscript //NoLogo rp.vbs
cscript //NoLogo rp.vbs One Two Two Three Three Three

''''''''''''rp.vbs''''''''''''
Option Explicit
Const WN=6
Dim fl,ch,cn,an,mx,nm
Sub perm(n)
  Dim i,j,s
  If mx<=n Then
    s=""
    For i=0 To n-1: s=s&ch(an(i)): Next
    nm=nm+1
    wsh.Echo(Right(String(WN,"0")&nm,WN)&":["&s&"]")
  Else
    For i=0 To mx-1
      If fl(i)=0 Then
        For j=0 To n-1:
          If ch(an(j))=ch(i) And cn(an(j))>cn(i) Then Exit For
        Next
        If n<=j Then
          fl(i)=1: an(n)=i
         perm(n+1): fl(i)=0
        End If
      End If
    Next
  End If
End Sub
Sub Main()
  Dim i,j,k
  If 0<wsh.Arguments.Count Then
    mx=wsh.Arguments.Count
    ReDim fl(mx-1),ch(mx-1),cn(mx-1),an(mx-1)
    For i=0 To mx-1: fl(i)=0: Next
    For i=0 To mx-1: k=0
      ch(i)= wsh.Arguments.Item(i)
      For j=0 To i-1
        If ch(i)=ch(j) Then k=k+1
      Next
      cn(i)=k
    Next
  Else
    mx=10
    ReDim an(mx-1)
    fl=Array( 0,0,0,0,0,0,0,0,0,0 )
    ch=Split("A A A B B B C C C C")
    cn=Array( 0,1,2,0,1,2,0,1,2,3 )
  End If
  nm=0: perm(0)
End Sub
Call Main()
''''''''''''''''''''''''''''''

  • 質問者

    bam********さん

    2019/3/2208:55:17

    返信遅れました。
    参考にさせて頂きます。

    ありがとうございました。

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

この回答は投票によってベストアンサーに選ばれました!

ベストアンサー以外の回答

1〜2件/2件中

並び替え:回答日時の
新しい順
|古い順

san********さん

2019/3/1811:35:14

10!/3!3!4!=10*3*4*7=210*4=840

int abc[10];
先頭から3つがAの位置、次の3つがBの位置
ということにすれば
1つの配列に1~10の順列を作るだけでよくなるため
これが一番簡単だけど
これだと重複をすべて含んでしまう

int a[3],b[3],c[4];
これらの中に順に小さいほうから数を入れていけばよい
2重ループで、a[0]が4ならa[1]は5以降だから
これ自体は簡単。
bの方はaで使ってる数字を飛ばさないといけないので
ちょっと面倒だけど

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

wat********さん

2019/3/1811:16:48

Aを置く場所の10C3通りを列挙し,そのそれぞれについてBを置く場所の7C3通りを組み合わせるというのはどうでしょうか。

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる