アプリ版:「スタンプのみでお礼する」機能のリリースについて

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


というように表示するプログラムです。どなたか分かる方がいらっしゃいましたら、よろしくお願いいたします。

A 回答 (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つの方法に固執しない方がいいと思います。
    • good
    • 1

試しに作ってみました


//-------------------------------------------------------------
/* 指定したリストの順列を表示する */
#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コ選ぶ順列
}

この回答への補足

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

補足日時:2005/11/16 03:01
    • good
    • 0

再帰的に作れると思います。


表示する順番が
(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
みたいなかんじになるとは思いますが・・・

この回答への補足

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

補足日時:2005/11/16 02:59
    • good
    • 0

まず貴方はどう考えましたか?


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

この回答への補足

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

補足日時:2005/11/16 02:56
    • good
    • 0

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