🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

C++

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

Q&A

解決済

1回答

787閲覧

1~12までの数字が入った配列をランダムな数に分割する方法

magomago

総合スコア7

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

C++

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

0グッド

0クリップ

投稿2020/11/28 13:17

1~12までの数字をランダムに並び替えた配列を、ランダムな個数に分割したいです。
例えば
{1,3,5,7,2,4,9,11,6,12,8,10}が入っている配列Aを
{1,3,5,7}の配列Bと
{2,4,9}の配列C
{11,6,12,8,10}の配列Dになる場合や

{1,3,5,7,2,4}の配列Bと
{9,11,6,12,8,10}の配列c
両方の場合ができるようにしたいです。

C++

1void generateInitialSolution() { 2vector<int> ride; 3 for (int i = 1; i <13; i++) { 4 ride.push_back(i); 5 } 6 random_device get_rand_dev; 7 mt19937 get_rand_mt(get_rand_dev()); 8 shuffle(ride.begin(), ride.end(), get_rand_mt); 9}

現在は1~12までの数字をrideという配列に入れランダムに並び替えるところまでしています。

補足情報

C++に触れてまだ浅いので配列を分割する方法などを手探りしながら勉強しています。
プログラミング自体が苦手なので基本的なことかもしれませんが教えてもらいたいです。

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

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

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

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

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

guest

回答1

0

ベストアンサー

C で書いてみたので、これが理解できたら、C++ に書き直してみてください。

C

1#include <stdio.h> // printf, putchar 2#include <stdlib.h> // rand 3 4#define N 6 5 6int a[N], p[N]; 7 8void divide(int n) 9{ 10 for (int m = 1; ; m++) { 11 p[n] = p[n-1] + m; 12 if (p[n] < N) divide(n+1); 13 else { 14 for (int i = 0; i < n; i++) { 15 int j = p[i], k = p[i+1]; 16 printf(" {%d", a[j]); 17 while (++j < k) printf(",%d", a[j]); 18 putchar('}'); 19 } 20 putchar('\n'); 21 return; 22 } 23 } 24} 25 26int main(void) 27{ 28 for (int i = 0; i < N; i++) a[i] = i + 1; 29 for (int i = 0; i < N; i++) { 30 int r = rand() % N; 31 int t = a[r]; a[r] = a[i]; a[i] = t; 32 } 33 divide(1); 34}

N が 6 の場合の実行結果

text

1 {2} {1} {4} {5} {6} {3} 2 {2} {1} {4} {5} {6,3} 3 {2} {1} {4} {5,6} {3} 4 {2} {1} {4} {5,6,3} 5 {2} {1} {4,5} {6} {3} 6 {2} {1} {4,5} {6,3} 7 {2} {1} {4,5,6} {3} 8 {2} {1} {4,5,6,3} 9 {2} {1,4} {5} {6} {3} 10 {2} {1,4} {5} {6,3} 11 {2} {1,4} {5,6} {3} 12 {2} {1,4} {5,6,3} 13 {2} {1,4,5} {6} {3} 14 {2} {1,4,5} {6,3} 15 {2} {1,4,5,6} {3} 16 {2} {1,4,5,6,3} 17 {2,1} {4} {5} {6} {3} 18 {2,1} {4} {5} {6,3} 19 {2,1} {4} {5,6} {3} 20 {2,1} {4} {5,6,3} 21 {2,1} {4,5} {6} {3} 22 {2,1} {4,5} {6,3} 23 {2,1} {4,5,6} {3} 24 {2,1} {4,5,6,3} 25 {2,1,4} {5} {6} {3} 26 {2,1,4} {5} {6,3} 27 {2,1,4} {5,6} {3} 28 {2,1,4} {5,6,3} 29 {2,1,4,5} {6} {3} 30 {2,1,4,5} {6,3} 31 {2,1,4,5,6} {3} 32 {2,1,4,5,6,3}

追記
何分割するかで分類してみました。

C

1#include <stdio.h> // printf, putchar 2#include <stdlib.h> // rand 3 4#define N 6 5 6int a[N], p[N]; 7 8void divide(int n) 9{ 10 if (n == 1) { 11 for (int i = 0; ; i++) { 12 int j = p[i], k = p[i+1]; 13 printf(" {%d", a[j]); 14 while (++j < k) printf(",%d", a[j]); 15 putchar('}'); 16 if (j == N) break; 17 } 18 putchar('\n'); 19 return; 20 } 21 for (int m = 1; ; m++) { 22 p[n-1] = p[n] - m; 23 if (p[n-1] <= 0) break; 24 divide(n-1); 25 } 26} 27 28int main(void) 29{ 30 for (int i = 0; i < N; i++) a[i] = i + 1; 31 for (int i = 0; i < N; i++) { 32 int r = rand() % N; 33 int t = a[r]; a[r] = a[i]; a[i] = t; 34 } 35 for (int i = 1; i <= N; i++) { 36 printf("--- %d ---\n", i); 37 p[i] = N; 38 divide(i); 39 } 40}

text

1--- 1 --- 2 {2,1,4,5,6,3} 3--- 2 --- 4 {2,1,4,5,6} {3} 5 {2,1,4,5} {6,3} 6 {2,1,4} {5,6,3} 7 {2,1} {4,5,6,3} 8 {2} {1,4,5,6,3} 9--- 3 --- 10 {2,1,4,5} {6} {3} 11 {2,1,4} {5,6} {3} 12 {2,1} {4,5,6} {3} 13 {2} {1,4,5,6} {3} 14 {2,1,4} {5} {6,3} 15 {2,1} {4,5} {6,3} 16 {2} {1,4,5} {6,3} 17 {2,1} {4} {5,6,3} 18 {2} {1,4} {5,6,3} 19 {2} {1} {4,5,6,3} 20--- 4 --- 21 {2,1,4} {5} {6} {3} 22 {2,1} {4,5} {6} {3} 23 {2} {1,4,5} {6} {3} 24 {2,1} {4} {5,6} {3} 25 {2} {1,4} {5,6} {3} 26 {2} {1} {4,5,6} {3} 27 {2,1} {4} {5} {6,3} 28 {2} {1,4} {5} {6,3} 29 {2} {1} {4,5} {6,3} 30 {2} {1} {4} {5,6,3} 31--- 5 --- 32 {2,1} {4} {5} {6} {3} 33 {2} {1,4} {5} {6} {3} 34 {2} {1} {4,5} {6} {3} 35 {2} {1} {4} {5,6} {3} 36 {2} {1} {4} {5} {6,3} 37--- 6 --- 38 {2} {1} {4} {5} {6} {3}

追記2
分割の全パターンを表示するのではなく、
指定した分割数で 1つだけ表示するようにしてみました。

C

1#include <stdio.h> // printf, putchar 2#include <stdlib.h> // rand 3 4#define N 12 5 6void print(const int a[], int i, int j) 7{ 8 printf(" {%d", a[i]); 9 while (++i < j) printf(",%d", a[i]); 10 putchar('}'); 11} 12 13void divide(const int a[], int n) 14{ 15 int i = 0; 16 for (int k; --n > 0; i += k) { 17 k = rand() % (N - i - n) + 1; 18 print(a, i, i + k); 19 } 20 print(a, i, N); 21 putchar('\n'); 22} 23 24int main(void) 25{ 26 int a[N]; 27 for (int i = 0; i < N; i++) a[i] = i + 1; 28 divide(a, 3); 29 divide(a, 2); 30}

配列をグローバル変数ではなく、関数の引数にしました。

投稿2020/11/28 14:34

編集2020/11/29 03:36
kazuma-s

総合スコア8224

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

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

magomago

2020/11/29 06:26

ご丁寧にありがとうございます。 自分で一から作れるよう理解して書き換えていきたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問