• 締切済み

順列をC言語で表現

mPnを求めるプログラムをC言語で表現したいです。 例えば、(1、2、3)とあったら (1 (2 (3 (1、2 (2、1 (2、3 (3、2 (1、3 (3、1 (1、2、3 (1,3,2 (2、1,3 (2,3,1 (3、1、2 (3,2,1 というように表示するプログラムです。どなたか分かる方がいらっしゃいましたら、よろしくお願いいたします。

みんなの回答

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.4

#3>これはリストを使っているのでしょうか? もちろんリスト構造みたいなのを作っても良いのですが、#3は、単なる文字列の配列です。 扱う構造は、 {"A","B","C",NULL}みたいな最後にNULLがある文字列の配列です。 例えば、3つのリストから2つを選ぶ順列の場合 Permutation(list,2,selected); 1段階目の呼出は、 {"1","2","3",NULL}が与えられたリストで、 2が選ぶべき要素の数、 selectedは{NULL}で中身がない状態のリスト を受け取ります。 ここでやることは、 {"1","2","3",NULL}から1つを選び、選んだ1つを除いたリストを更に下請けに回すことです。 1を選んだ場合 Permutation({"1","2","3",NULL},2,{NULL}); から Permutation(残りのリスト,残りの選ぶ数,既に選んだ数のリスト); Permutation({"2","3",NULL},1,{"1",NULL}); として下請けを呼び出します。 下請けでは、選ぶ数が1つになっていたら、 既に選ばれたリストを表示し、今選ぶ1つを表示してreturnします。 まあ、そんな感じです。 * やり方はいろいろあるかと思うので、1つの方法に固執しない方がいいと思います。

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.3

試しに作ってみました //------------------------------------------------------------- /* 指定したリストの順列を表示する */ #include <stdio.h> #include <malloc.h> void Permutation(char **list, int select, char **selected){ char **newList, **newSelected, **p; int listSize, selectSize, i; //それぞれのリストのサイズを求める for(listSize=0;list[listSize]!=NULL;listSize++); for(selectSize=0;selected[selectSize]!=NULL;selectSize++); if(select==1){//選択するものが1つ for(i=0;i<listSize;i++){ for(p=selected;*p!=NULL;p++){ printf("%s ", *p);//既に選択されたものを表示 } printf("%s\n",list[i]);//今選ばれた1つをその後に表示 } return; } newList=(char**)malloc(sizeof(char*)*listSize);//新しいリストサイズが1減る newSelected=(char**)malloc(sizeof(char*)*selectSize+2);//新しいリストは+1 for(i=0,p=selected;*p!=NULL;p++){ newSelected[i]=*p;//既に選ばれたリストのコピーを作る } for(i=0;i<listSize;i++){ int j; newSelected[selectSize]=list[i];//新しく選ばれたものをリストに追加 newSelected[selectSize+1]=NULL; for(j=0,p=newList;j<listSize;j++){ if(j!=i){ *p++=list[j];//選ばれた物を除いたリストのコピー } } *p=NULL; Permutation(newList, select-1, newSelected); } free(newSelected); free(newList); } void main(void){ char *list[]={"1","2","3",NULL}; char *selected[]={ NULL }; Permutation(list,1,selected);//リストから1コ選ぶ順列 Permutation(list,2,selected);//リストから2コ選ぶ順列 Permutation(list,3,selected);//リストから3コ選ぶ順列 }

tttt12345jp
質問者

補足

ありがとうございます。これはリストを使っているのでしょうか?この辺の使い方がよくわからないです。もしよろしければ、少し解説していただけると幸いです。

noname#16765
noname#16765
回答No.2

再帰的に作れると思います。 表示する順番が (1 (1、2 (1、2、3 (1、3 (1,3,2 (2 (2、1 (2、1,3 (2、3 (2,3,1 (3 (3、1 (3、1、2 (3、2 (3,2,1 みたいなかんじになるとは思いますが・・・

tttt12345jp
質問者

補足

ありがとうございます。再帰をつかえばよいということろまではわかるのですが、そこから先がなんとも。。。ほとんどC初心者といってもいいかもしれません。わかりやすく、解説して頂けたら幸いです。

回答No.1

まず貴方はどう考えましたか? 例を書いているのだから解き方(アルゴリズム)は判っているのですよね? まずそこを書いてどの部分をCでどう表現したらいいのか判らないのか書いてください。

tttt12345jp
質問者

補足

すみませんでした。再帰を使えばよいということろまではわかっています。ですが、何分C言語は初心者で、そこから先が何をしていいのかわからない状況です。最終的には、flexという言語で表現しなければならないのです。まずはC言語でアルゴリズムを理解しようと思い、質問をさせて頂きました。

関連するQ&A