質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

4回答

537閲覧

順列並べ替え12個づつ表示

KeiD

総合スコア26

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2020/07/31 00:07

ijklmの5文字の順列(120個)を以下のプログラムで出力表示すると

#include <stdio.h> char data[5]="ijklm"; char disp[5]="ijklm"; int flg[5]={0}; void sub(int num) { int i; if(num==5) printf("%s ",disp); else { for(i=0;i<5;i++) { if(!flg[i]) { flg[i]=1; disp[num]=data[i]; sub(num+1); flg[i]=0; } } } } int main() { sub(0); return 0; }

ijklm ijkml ijlkm ijlmk ijmkl ijmlk ikjlm ikjml ikljm iklmj ikmjl ikmlj iljkm iljmk ilkjm i
lkmj ilmjk ilmkj imjkl imjlk imkjl imklj imljk imlkj jiklm jikml jilkm jilmk jimkl jimlk jk
ilm jkiml jklim jklmi jkmil jkmli jlikm jlimk jlkim jlkmi jlmik jlmki jmikl jmilk jmkil jmk
li jmlik jmlki kijlm kijml kiljm kilmj kimjl kimlj kjilm kjiml kjlim kjlmi kjmil kjmli klij
m klimj kljim kljmi klmij klmji kmijl kmilj kmjil kmjli kmlij kmlji lijkm lijmk likjm likmj
limjk limkj ljikm ljimk ljkim ljkmi ljmik ljmki lkijm lkimj lkjim lkjmi lkmij lkmji lmijk
lmikj lmjik lmjki lmkij lmkji mijkl mijlk mikjl miklj miljk milkj mjikl mjilk mjkil mjkli m
jlik mjlki mkijl mkilj mkjil mkjli mklij mklji mlijk mlikj mljik mljki mlkij mlkji

と表示されますが、1行につき8個ずつ、15行で表示するために以下のように変更しましたが

#include <stdio.h> char data[5]="ijklm"; char disp[5]="ijklm"; int flg[5]={0}; void sub(int num) { int i; if(num==5) printf("%s ",disp); int cnt;                \\追加した個所 はじめ cnt++; if(cnt % 8 == 0){ printf("\n");}    \\追加した個所 終わり else { for(i=0;i<5;i++) { if(!flg[i]) { flg[i]=1; disp[num]=data[i]; sub(num+1); flg[i]=0; } } } } int main() { sub(0); return 0; }

出力は8個ずつ15行にはならず、

ljkim ljkmi ljmik
lkijm lkimj
lkmij lkmji
mijkl mijlk mikjl miklj
miljk milkj
mjkil mjkli mjlik
mkijl mkilj mkjil mkjli
mklij mklji mlijk
mljik mljki .....

のように表示されてしまいます。
8個ずつ15行で表示するにはどう直せばよいか
ご存じの方よろしくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

cntはローカルな自動変数ではだめなので、グローバル変数かスタティック変数にする。
cntの初期値0を設定する。

C

1void sub(int num) 2{ 3 static int cnt = 0; 4 if (num == 5) { 5 printf("%s ",disp); 6 cnt++; 7 if (cnt % 8 == 0) { 8 printf("\n"); 9 cnt = 0; 10 } 11 return; 12 } 13 14 for (int i = 0; i < 5; i++) { 15 if (!flg[i]) { 16 flg[i] = 1; 17 disp[num] = data[i]; 18 sub(num + 1); 19 flg[i] = 0; 20 } 21 } 22}

result

1jklim jklmi jkmil jkmli jlikm jlimk jlkim jlkmi 2jlmik jlmki jmikl jmilk jmkil jmkli jmlik jmlki 3kijlm kijml kiljm kilmj kimjl kimlj kjilm kjiml 4kjlim kjlmi kjmil kjmli klijm klimj kljim kljmi 5klmij klmji kmijl kmilj kmjil kmjli kmlij kmlji 6lijkm lijmk likjm likmj limjk limkj ljikm ljimk 7ljkim ljkmi ljmik ljmki lkijm lkimj lkjim lkjmi 8lkmij lkmji lmijk lmikj lmjik lmjki lmkij lmkji 9mijkl mijlk mikjl miklj miljk milkj mjikl mjilk 10mjkil mjkli mjlik mjlki mkijl mkilj mkjil mkjli 11mklij mklji mlijk mlikj mljik mljki mlkij mlkji

投稿2020/07/31 00:39

Daregada

総合スコア11990

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KeiD

2020/07/31 00:41

ありがとうございます!
guest

0

ベストアンサー

C

1#include <stdio.h> 2 3char data[5]="ijklm"; 4char disp[5]="ijklm"; 5 6int flg[5]={0}; 7 8int sub_(int num, int c) { 9 if( num == 5 ) { 10 printf("%s ", disp); 11 // 8個おきに改行 12 if ( ++c % 8 == 0 ) { 13 putchar('\n'); 14 } 15 } else { 16 int i; 17 for ( i = 0; i < 5; i++) { 18 if ( !flg[i] ) { 19 flg[i] = 1; 20 disp[num] = data[i]; 21 c = sub_(num+1, c); 22 flg[i] = 0; 23 } 24 } 25 } 26 return c; 27} 28 29// 順列を生成し、その総数を返す 30int sub(int num) { 31 return sub_(num, 0); 32} 33 34int main() { 35 int c = sub(0); 36 printf("\n%d\n", c); 37 return 0; 38}

投稿2020/07/31 00:37

episteme

総合スコア16614

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KeiD

2020/07/31 00:39

ありがとうございました!
guest

0

cnt変数がローカル変数でしかも初期化してません。
初期化してなければでたらめな値が入ってます

こいつをグローバル変数にして、初期値に1入れとけばいいかと

投稿2020/07/31 00:26

編集2020/07/31 00:27
y_waiwai

総合スコア87784

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KeiD

2020/07/31 00:39

ありがとうございます
guest

0

タグが C++ になっていますが、C++ では、
char data[5] = "ijklm"; はエラーになります。

C

1#include <stdio.h> 2 3char data[5] = "ijklm", disp[5] = "ijklm", flg[5], cnt; 4 5void sub(int n) 6{ 7 if (n == 5) 8 printf(++cnt == 8 ? cnt = 0, "%s\n" : "%s ", disp); 9 else 10 for (int i = 0; i < 5; i++) 11 if (!flg[i]) 12 flg[i] = 1, disp[n] = data[i], sub(n + 1), flg[i] = 0; 13} 14 15int main(void) { sub(0); }

投稿2020/07/31 01:08

kazuma-s

総合スコア8224

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KeiD

2020/07/31 02:14

ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問