合計 昨日 今日

配列内[5][15]の組み合わせ.

フォーラムルール
フォーラムルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら

Name: かずま
[URL]
Date: 2017年11月30日(木) 01:40
No: 31
(OFFLINE)

 Re: 配列内[5][15]の組み合わせ.

のんのん#24 さんが書きました:6回データを表示したら、その内の5個を選び出して出力する方法はどうすればいいでしょうか?

6行のデータの 5個を開始位置を変えて 6回出力するんですよね。
コード[C]: 全て選択
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include <stdio.h>
 
int a[6][4] = {
    11,  1,  0,  0,
     1, 11,  0,  0,
     0,  0, 11,  1,
     0,  0,  1, 11,
    11, 11,  0,  0,
     0,  0, 11, 11,
};
unsigned long long count;
 
void pr(int n)
{
    printf("%26.21s\n", "//////////12345678910//////////" + 11 - n);
}
 
void print(void)
{
    printf("[%llu]\n", ++count);
    for (int i = 0; i < 6; i++)
        printf(" %2d %2d 11 %2d %2d\n", a[i][0], a[i][1], a[i][2], a[i][3]);
    for (int i = 0; i < 6; i++) {
        for (int k = i, j = 5; --j >= 0; ++k > 5 && (k = 0)) {
            printf("   [%llu-%d]\n", count, k + 1);
            pr(a[k][0]), pr(a[k][1]), pr(11), pr(a[k][2]), pr(a[k][3]);
        }
        printf("   Enter"), getchar();
    }
}
 
int ok(int i, int j, int k)
{
    for (int n = 0; n < 4; n++)
        if (a[i][n] == k) return 0;
    for (int n = 0; n < 6; n++)
        if (a[n][j] == k) return 0;
    return 1;
}
 
void step(int i, int j)
{
    if (j == 4) {
        j = 0;
        if (++i == 6) { print(); printf("type ENTER"); getchar(); return; }
    }
    for (int k = 2; k <= 10; k++)
        if (a[i][j])
            step(i, j + 1);
        else
            if (ok(i, j, k)) a[i][j] = k, step(i, j + 1), a[i][j] = 0;
}
 
int main(void) { step(0, 0); }

実行結果
コード[Text]: 全て選択
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
[1]
 11  1 11  2  3
  1 11 11  3  2
  2  3 11 11  1
  3  2 11  1 11
 11 11 11  4  5
  4  5 11 11 11
   [1-1]
     //////////12345678910
     12345678910//////////
     //////////12345678910
     /12345678910/////////
     //12345678910////////
   [1-2]
     12345678910//////////
     //////////12345678910
     //////////12345678910
     //12345678910////////
     /12345678910/////////
   [1-3]
     /12345678910/////////
     //12345678910////////
     //////////12345678910
     //////////12345678910
     12345678910//////////
   [1-4]
     //12345678910////////
     /12345678910/////////
     //////////12345678910
     12345678910//////////
     //////////12345678910
   [1-5]
     //////////12345678910
     //////////12345678910
     //////////12345678910
     ///12345678910///////
     ////12345678910//////
   Enter
   [1-2]
     12345678910//////////
     //////////12345678910
     //////////12345678910
     //12345678910////////
     /12345678910/////////
   [1-3]
     /12345678910/////////
     //12345678910////////
     //////////12345678910
     //////////12345678910
     12345678910//////////
   [1-4]
     //12345678910////////
     /12345678910/////////
     //////////12345678910
     12345678910//////////
     //////////12345678910
   [1-5]
     //////////12345678910
     //////////12345678910
     //////////12345678910
     ///12345678910///////
     ////12345678910//////
   [1-6]
     ///12345678910///////
     ////12345678910//////
     //////////12345678910
     //////////12345678910
     //////////12345678910
   Enter
   [1-3]
     /12345678910/////////
     //12345678910////////
     //////////12345678910
     //////////12345678910
     12345678910//////////
   [1-4]
     //12345678910////////
     /12345678910/////////
     //////////12345678910
     12345678910//////////
     //////////12345678910
   [1-5]
     //////////12345678910
     //////////12345678910
     //////////12345678910
     ///12345678910///////
     ////12345678910//////
   [1-6]
     ///12345678910///////
     ////12345678910//////
     //////////12345678910
     //////////12345678910
     //////////12345678910
   [1-1]
     //////////12345678910
     12345678910//////////
     //////////12345678910
     /12345678910/////////
     //12345678910////////
   Enter
   [1-4]
     //12345678910////////
     /12345678910/////////
     //////////12345678910
     12345678910//////////
     //////////12345678910
   [1-5]
     //////////12345678910
     //////////12345678910
     //////////12345678910
     ///12345678910///////
     ////12345678910//////
   [1-6]
     ///12345678910///////
     ////12345678910//////
     //////////12345678910
     //////////12345678910
     //////////12345678910
   [1-1]
     //////////12345678910
     12345678910//////////
     //////////12345678910
     /12345678910/////////
     //12345678910////////
   [1-2]
     12345678910//////////
     //////////12345678910
     //////////12345678910
     //12345678910////////
     /12345678910/////////
   Enter
   [1-5]
     //////////12345678910
     //////////12345678910
     //////////12345678910
     ///12345678910///////
     ////12345678910//////
   [1-6]
     ///12345678910///////
     ////12345678910//////
     //////////12345678910
     //////////12345678910
     //////////12345678910
   [1-1]
     //////////12345678910
     12345678910//////////
     //////////12345678910
     /12345678910/////////
     //12345678910////////
   [1-2]
     12345678910//////////
     //////////12345678910
     //////////12345678910
     //12345678910////////
     /12345678910/////////
   [1-3]
     /12345678910/////////
     //12345678910////////
     //////////12345678910
     //////////12345678910
     12345678910//////////
   Enter
   [1-6]
     ///12345678910///////
     ////12345678910//////
     //////////12345678910
     //////////12345678910
     //////////12345678910
   [1-1]
     //////////12345678910
     12345678910//////////
     //////////12345678910
     /12345678910/////////
     //12345678910////////
   [1-2]
     12345678910//////////
     //////////12345678910
     //////////12345678910
     //12345678910////////
     /12345678910/////////
   [1-3]
     /12345678910/////////
     //12345678910////////
     //////////12345678910
     //////////12345678910
     12345678910//////////
   [1-4]
     //12345678910////////
     /12345678910/////////
     //////////12345678910
     12345678910//////////
     //////////12345678910
   Enter
type ENTER
[2]
 11  1 11  2  3
  1 11 11  3  2
  2  3 11 11  1
  3  2 11  1 11
 11 11 11  4  5
  4  5 11 11 11
   [2-1]
     //////////12345678910
     12345678910//////////
     //////////12345678910
     /12345678910/////////
     //12345678910////////
   [2-2]
     12345678910//////////
     //////////12345678910
     //////////12345678910
     //12345678910////////
     /12345678910/////////
   [2-3]
     /12345678910/////////
     //12345678910////////
     //////////12345678910
     //////////12345678910
     12345678910//////////
   [2-4]
     //12345678910////////
     /12345678910/////////
     //////////12345678910
     12345678910//////////
     //////////12345678910
   [2-5]
     //////////12345678910
     //////////12345678910
     //////////12345678910
     ///12345678910///////
     ////12345678910//////
   Enter

Name: のんのん#24
[URL]
入門者(2,626 ポイント)
Date: 2017年12月01日(金) 13:35
No: 32
(OFFLINE)

 Re: 配列内[5][15]の組み合わせ.

ありがとうございます!
実行結果を以下のようにも出力させるにはどうしたらよいでしょうか?
コード[Text]: 全て選択
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[1]
 11  1 11  2  3
  1 11 11  3  2
  2  3 11 11  1
  3  2 11  1 11
 11 11 11  4  5
  4  5 11 11 11
   [1-1]
     11 1 11 2 3
      1 11 11 3 2
     2  3  11  1 1
     3  2  11  1 11
    11 11 11 4  5
 
   [1-2]
     1 11 11 3  2
     2 3  11  1  1
    3  2  11  1  11
    11 11 11 4  5
    4  5   11 11 11




コード[C++]: 全て選択
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void print(void)
{
    printf("[%llu]\n", ++count);
    for (int i = 0; i < 6; i++)
        printf(" %2d %2d 11 %2d %2d\n", a[i][0], a[i][1], a[i][2], a[i][3]);
    for (int i = 0; i < 6; i++) {
        for (int k = i, j = 5; --j >= 0; ++k > 5 && (k = 0)) {
            printf("   [%llu-%d]\n", count, k + 1);
    for (k=0;k<5;k++)
            {
            printf("%2d %2d 11 %2d %2d\n",a[k][0], a[k][1], a[k][2], a[k][3];
        }
           printf("\n\n");
       }
        printf("   Enter"), getchar();
    }
}


としたら同じ物しか出力されなかったので教えて頂きたいです。

Name: かずま
[URL]
Date: 2017年12月01日(金) 18:28
No: 33
(OFFLINE)

 Re: 配列内[5][15]の組み合わせ.

のんのん#24 さんが書きました:実行結果を以下のようにも出力させるにはどうしたらよいでしょうか?

print を変更しました。
また、step の先頭で表示のための条件が
間違っていたので修正しました。
コード[C]: 全て選択
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include <stdio.h>
 
int a[6][4] = {
    11,  1,  0,  0,
     1, 11,  0,  0,
     0,  0, 11,  1,
     0,  0,  1, 11,
    11, 11,  0,  0,
     0,  0, 11, 11,
};
unsigned long long count;
 
void print(void)
{
    printf("[%llu]\n", ++count);
    for (int i = 0; i < 6; i++)
        printf(" %2d %2d 11 %2d %2d\n", a[i][0], a[i][1], a[i][2], a[i][3]);
    for (int i = 0; i < 6; i++) {
        printf("   [%llu-%d]\n", count, i + 1);
        for (int k = i, j = 5; --j >= 0; ++k > 5 && (k = 0))
            printf("%7d %2d 11 %2d %2d\n", a[k][0], a[k][1], a[k][2], a[k][3]);
        //printf("   Enter"), getchar();
    }
}
 
int ok(int i, int j, int k)
{
    for (int n = 0; n < 4; n++)
        if (a[i][n] == k) return 0;
    for (int n = 0; n < 6; n++)
        if (a[n][j] == k) return 0;
    return 1;
}
 
void step(int i, int j)
{
    if (j == 4) j = 0, ++i;
    if (i == 5 && j == 2) { print(); printf("type ENTER"); getchar(); return; }
    for (int k = 2; k <= 10; k++)
        if (a[i][j])
            step(i, j + 1);
        else if (ok(i, j, k))
            a[i][j] = k, step(i, j + 1), a[i][j] = 0;
}
 
int main(void) { step(0, 0); }

Name: かずま
[URL]
Date: 2017年12月03日(日) 11:32
No: 34
(OFFLINE)

 Re: 配列内[5][15]の組み合わせ.

step() に無駄があったので修正します。
コード[C]: 全て選択
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include <stdio.h>
 
int a[6][4] = {
    11,  1,  0,  0,
     1, 11,  0,  0,
     0,  0, 11,  1,
     0,  0,  1, 11,
    11, 11,  0,  0,
     0,  0, 11, 11,
};
unsigned long long count;
 
void print(void)
{
    printf("[%llu]\n", ++count);
    for (int i = 0; i < 6; i++)
        printf(" %2d %2d 11 %2d %2d\n", a[i][0], a[i][1], a[i][2], a[i][3]);
    for (int i = 0; i < 6; i++) {
        printf("   [%llu-%d]\n", count, i + 1);
        for (int k = i, j = 5; --j >= 0; ++k > 5 && (k = 0))
            printf("%7d %2d 11 %2d %2d\n", a[k][0], a[k][1], a[k][2], a[k][3]);
        //printf("   Enter"), getchar();
    }
}
 
int ok(int i, int j, int k)
{
    for (int n = 0; n < 4; n++)
        if (a[i][n] == k) return 0;
    for (int n = 0; n < 6; n++)
        if (a[n][j] == k) return 0;
    return 1;
}
 
void step(int i, int j)
{
    if (j == 4) {
        j = 0;
        if (++i == 6) { print(); printf("type ENTER"); getchar(); return; }
    }
    if (a[i][j])
        step(i, j + 1);
    else
        for (int k = 2; k <= 10; k++)
            if (ok(i, j, k)) a[i][j] = k, step(i, j + 1), a[i][j] = 0;
}
 
int main(void) { step(0, 0); }

で、問題は解決したのでしょぅか?

Name: のんのん#24
[URL]
入門者(2,626 ポイント)
Date: 2017年12月07日(木) 10:33
No: 35
(OFFLINE)

 Re: 配列内[5][15]の組み合わせ.

当初の問題は解決しました!
本当にありがとうございます。

6行5列の
 11, 1, 0, 0,
1, 11, 0, 0,
0, 0, 11, 1,
0, 0, 1, 11,
11, 11, 0, 0,
0, 0, 11, 11,

0が入っている場所なんですけど、縦と横の数字が被らず、隣り合う数字の差を取ったときに数が同じにならない
ようにしたいんですけど
コード[C++]: 全て選択
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
 
            h[0][0] = 11;
            h[0][1] = 1;
            printf("%3d%3d", h[0][0], h[0][1]);
 
            h[0][2] = rand() % 9 + 2;
            printf("%3d ", h[0][2]);
 
            do
            {
                h[0][3] = rand() % 9 + 2;
            } while (h[0][3] == h[0][2]);
            printf("%3d ", h[0][3]);
            printf("\n");
 
            h[1][0] = 1;
            h[1][1] = 11;
            printf("%3d%3d", h[1][0], h[1][1]);
 
            do
            {
                h[1][2] = rand() % 9 + 2;
            } while (h[1][2] == h[0][2]);
            printf("%3d ", h[1][2]);
 
            do
            {
                h[1][3] = rand() % 9 + 2;
            } while (h[1][3] == h[0][3] && h[1][3] == h[1][2]);
            printf("%3d ", h[1][3]);
            printf("\n");
 
            h[2][0] = 11;
            h[2][1] = 11;
            printf("%3d%3d", h[2][0], h[2][1]);
 
            do
            {
                h[2][2] = rand() % 9 + 2;
            } while (h[2][2] == h[1][2] && h[2][2] == h[0][2]);
            printf("%3d ", h[2][2]);
 
            do
            {
                h[2][3] = rand() % 9 + 2;
            } while (h[2][3] == h[2][2] && h[2][3] == h[1][2] && h[2][3] == h[0][3]);
            printf("%3d ", h[2][3]);
            printf("\n");

このような感じになっています。スッキリした書き方等あれば教えて頂きたいです。

Name: かずま
[URL]
Date: 2017年12月07日(木) 17:02
No: 36
(OFFLINE)

 Re: 配列内[5][15]の組み合わせ.

これで、いかがでしょうか?
コード[C]: 全て選択
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include <stdio.h>
#include <string.h> // memcopy
#include <stdlib.h> // rand, srand
#include <time.h>   // time
 
int h[6][4], h0[6][4] = {
    11,  1,  0,  0,
     1, 11,  0,  0,
     0,  0, 11,  1,
     0,  0,  1, 11,
    11, 11,  0,  0,
     0,  0, 11, 11,
};
 
void print_h(void)
{
    for (int i = 0; i < 6; i++)
        printf("%2d %2d 11 %2d %2d\n", h[i][0], h[i][1], h[i][2], h[i][3]);
}
 
void make_h(void)
{
    memcpy(h, h0, sizeof h);
    for (int i = 0; i < 6; i++)
        for (int j = 0; j < 4; j++)
            if (h[i][j] == 0) {
                int k, n = 0, a[12] = { 0,0,2,3,4,5,6,7,8,9,10,0 };
                for (k = 0; k < j; k++) a[h[i][k]] = 0;
                for (k = 0; k < i; k++) a[h[k][j]] = 0;
                for (k = 2; k <= 10; k++)
                    if (a[k]) a[n++] = k;
                h[i][j] = a[rand() % n];
            }
}
 
int main(void)
{
    srand(time(0));
    do {
        make_h();
        print_h();
        printf("Enter: ");
    } while (getchar() == '\n');
}

Name: かずま
[URL]
Date: 2017年12月07日(木) 18:31
No: 37
(OFFLINE)

 Re: 配列内[5][15]の組み合わせ.

のんのん#24 さんが書きました:0が入っている場所なんですけど、縦と横の数字が被らず、隣り合う数字の差を取ったときに数が同じにならない
ようにしたいんですけど

「隣り合う数字の差を取ったときに数が同じにならない」がよくわかりません。
具体的に、こんなのはダメだという例を示してください。

Name: のんのん#24
[URL]
入門者(2,626 ポイント)
Date: 2017年12月08日(金) 15:49
No: 38
(OFFLINE)

 Re: 配列内[5][15]の組み合わせ.

かずま さんが書きました:
のんのん#24 さんが書きました:0が入っている場所なんですけど、縦と横の数字が被らず、隣り合う数字の差を取ったときに数が同じにならない
ようにしたいんですけど

「隣り合う数字の差を取ったときに数が同じにならない」がよくわかりません。
具体的に、こんなのはダメだという例を示してください。


例えば
11 1 11 2 3
1 11 11 3 2

とあったとき、1行目の2と3の差は1
2行目の3と2の差も1なのでこの場合は処理を繰り返すってことです。

この話をしていたら、乱数で回していたら欲しい数字がくるまでにもしかしたらすごい時間がかかるかもしれない
ということになったので、乱数じゃなくて、整数でこの繰り返しの処理が出来るのであれば教えて頂きたいです。
何度も申し訳ございません。

1つ前へ

Return to C言語何でも質問掲示板

オンラインデータ

このフォーラムを閲覧中のユーザー: なし & ゲスト[12人]