A 回答 (4件)
- 最新から表示
- 回答順に表示
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つの方法に固執しない方がいいと思います。
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コ選ぶ順列
}
この回答への補足
ありがとうございます。これはリストを使っているのでしょうか?この辺の使い方がよくわからないです。もしよろしければ、少し解説していただけると幸いです。
補足日時:2005/11/16 03:01お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語 コマンドライン引数 4 2023/02/09 18:47
- C言語・C++・C# C言語の質問です。 以下の命令を実行するプログラムを作りました ①文字列aとbの長さを表示 ②aとb 1 2022/04/29 15:35
- C言語・C++・C# C言語初心者 構造体 課題について 2 2023/03/10 19:48
- C言語・C++・C# C言語について。 3 2022/11/05 20:30
- Visual Basic(VBA) ファイル全てを .xlsm に変更したところ、プログラムが途中で落ちてしまっています 17 2022/12/07 12:03
- C言語・C++・C# 画像の画素値を変えるC言語のプログラムで指定された画像の中に白い三角形を右上に表示させるにはどのよう 3 2022/10/30 01:16
- C言語・C++・C# exeファイルが作れない(windows10) 6 2022/08/13 08:47
- その他(プログラミング・Web制作) プログラムの勉強のおすすめは 7 2022/12/09 20:09
- C言語・C++・C# linux C言語について ./ファイル名 入力値 入力値が表示 という風に実行と入力を同時にしたい 3 2022/10/17 16:57
- C言語・C++・C# C言語で 英文字のみからなる文字列、”Radar”、”WasItACatISaw”、”a”、””(空 5 2022/12/20 15:17
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
fgetsなどのときのstdinのバッ...
-
str系関数を使わずに二つの文字...
-
配列をnビットシフトする
-
Win32APIでのエディットボック...
-
型変換
-
全角文字を含んだ文字の並びを...
-
c言語です。
-
下記のプログラムがコンパイラ...
-
c言語の問題の説明、各所ごとに
-
strlen関数と同じ働きをする関...
-
C言語で、入力された、文字列を...
-
double型の値をchar配列に変換...
-
C言語の入力した文字を反転させ...
-
enumの記述について。
-
c言語でソーベルフィルタが作り...
-
宣言による処理の重さ
-
文字列の中から必要なデータを...
-
CStringをwchar_tに変換したい
-
間接操作のレベルとは
-
'const char *' 型は 'char *' ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
fgetsなどのときのstdinのバッ...
-
charでの計算?
-
C言語のfor文です。 繰り返しの...
-
charからLPTSTRへの変換方法
-
文字列から空白を取り除きたい...
-
C言語の入力した文字を反転させ...
-
'const char *' 型は 'char *' ...
-
配列をnビットシフトする
-
str系関数を使わずに二つの文字...
-
int main()の・・・
-
atoi( ) の反対をやりたい
-
c++ 文字列を入力して、一文字...
-
CStringをwchar_tに変換したい
-
switch文で文字を比較すること...
-
干支のプログラム
-
絶対パスからのファイル名の切...
-
3桁区切(コンマ)記号をつけ...
-
間接操作のレベルとは
-
間接参照のレベルが異なっています
-
【C言語】文字型と整数型の違い
おすすめ情報