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

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

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

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

Q&A

解決済

3回答

506閲覧

3個文字並べ替えで同じ文字列を非表示にする

KeiD

総合スコア26

C++

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

0グッド

0クリップ

投稿2020/08/01 00:04

以下のプログラムでijkと入力すると

#include <stdio.h> void sub(int num, int* cnt, int* flg, char* data, char* disp) { if (num == 3) { disp[3] = '\0'; printf("%s ", disp); *cnt += 1; if (*cnt % 5 == 0) { printf("\n"); *cnt = 0; } return; } for (int i = 0; i < 3; i++) { if (!flg[i]) { flg[i] = 1; disp[num] = data[i]; sub(num + 1, cnt, flg, data, disp); flg[i] = 0; } } } int main() { char data[4]; scanf("%s", data); char disp[4]; int flg[3] = { 0 }; int cnt = 0; sub(0, &cnt, flg, data, disp); return 0; }

ijk
ijk ikj jik jki kij
kji
と表示されますが、

iikと入力すると

iik
iik iki iik iki kii
kii
となり同じ文字列が表示されます。

oooと入力すると
ooo
ooo ooo ooo ooo ooo
ooo
となります。

iik, ooo と入力して出力がそれぞれ

iik
iik iki kii

ooo
ooo
と同じ文字列が表示されなくするにはどうプログラム変更すればよいか
ご存じの方よろしくお願い致します。

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

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

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

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

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

dodox86

2020/08/01 00:19

別の内容とは言え、質問を連投されていますが、 > どうプログラム変更すればよいか > ご存じの方よろしくお願い致します。 この文面で他者に依存している感じが濃厚です。新しいプログラムを作っているわけなのですから、既にご存じかどうかではなく、新しいプログラムにそれぞれ対応するのです。 [5文字を入力し順列を出力する] https://teratail.com/questions/281734 のコメントで助言いただいたように、デバッグ環境を整えてどこに原因があり、どう変更すべきか考えてみてはいかがでしょうか。
KeiD

2020/08/01 00:34

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

回答3

0

C

1#include <stdio.h> 2 3void sub(int n, int *cnt, int *m, int *freq, char *data, char *disp) 4{ 5 if (n == 3) { 6 if (++*cnt < 5) 7 printf("%s ", disp); 8 else { 9 *cnt = 0; 10 printf("%s\n", disp); 11 } 12 } 13 else { 14 for (int i = 0; i < *m; i++) { 15 if (freq[i] > 0) { 16 disp[n] = data[i]; 17 freq[i]--; 18 sub(n + 1, cnt, m, freq, data, disp); 19 freq[i]++; 20 } 21 } 22 } 23} 24 25int main() 26{ 27 char data[4]; 28 scanf("%s", data); 29 char disp[4] = ""; 30 int freq[3] = { 0 }; 31 int m = 0; 32 for (int j, i = 0; i < 3; i++) { 33 for (j = 0; j < m && data[j] != data[i]; j++) ; 34 if (j == m) data[m++] = data[i]; 35 freq[j]++; 36 } 37 int cnt = 0; 38 sub(0, &cnt, &m, freq, data, disp); 39 if (cnt) putchar('\n'); 40 return 0; 41}

コメントには「ありがとうございます。」だけでなく、
「理解できました。」または「理解できませんでした。」の
どちらかを必ず書いてください。
理解できなかった場合、どこが分からないのかを質問してください。
そうすれば説明します。

投稿2020/08/01 07:43

編集2020/08/01 07:54
kazuma-s

総合スコア8224

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

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

KeiD

2020/08/01 09:06

ありがとうございます。 理解できない個所があれば質問させていただきます。
guest

0

ベストアンサー

C++なら簡単だ:

C++

1#include <iostream> 2#include <string> 3#include <algorithm> 4 5int main() { 6 using namespace std; 7 string data; 8 cin >> data; 9 sort(data.begin(), data.end()); 10 int count = 0; 11 do { 12 cout << data << ' '; 13 if ( ++count % 8 == 0 ) { 14 cout << endl; 15 } 16 } while ( next_permutation(data.begin(), data.end()) ); 17 18}

投稿2020/08/01 00:20

episteme

総合スコア16612

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

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

KeiD

2020/08/01 00:27

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

0

表示する文字列を貯めていき、表示する場合に、そこに登録されている文字列かをチェックし、登録されていれば表示しないようにしましょう

投稿2020/08/01 00:14

y_waiwai

総合スコア88042

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

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

KeiD

2020/08/01 00:27

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問