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

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

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

#31

投稿記事 by かずま » 1年前

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

コード:

#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); }
実行結果

コード:

[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

のんのん#24
記事: 19
登録日時: 2年前

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

#32

投稿記事 by のんのん#24 » 1年前

ありがとうございます!
実行結果を以下のようにも出力させるにはどうしたらよいでしょうか?

コード:

[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
…

コード:

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();
    }
}

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

かずま

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

#33

投稿記事 by かずま » 1年前

のんのん#24 さんが書きました: 実行結果を以下のようにも出力させるにはどうしたらよいでしょうか?
print を変更しました。
また、step の先頭で表示のための条件が
間違っていたので修正しました。

コード:

#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); }

かずま

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

#34

投稿記事 by かずま » 1年前

step() に無駄があったので修正します。

コード:

#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); }
で、問題は解決したのでしょぅか?

のんのん#24
記事: 19
登録日時: 2年前

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

#35

投稿記事 by のんのん#24 » 1年前

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

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が入っている場所なんですけど、縦と横の数字が被らず、隣り合う数字の差を取ったときに数が同じにならない
ようにしたいんですけど

コード:


			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");
このような感じになっています。スッキリした書き方等あれば教えて頂きたいです。

かずま

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

#36

投稿記事 by かずま » 1年前

これで、いかがでしょうか?

コード:

#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');
}

かずま

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

#37

投稿記事 by かずま » 1年前

のんのん#24 さんが書きました: 0が入っている場所なんですけど、縦と横の数字が被らず、隣り合う数字の差を取ったときに数が同じにならない
ようにしたいんですけど
「隣り合う数字の差を取ったときに数が同じにならない」がよくわかりません。
具体的に、こんなのはダメだという例を示してください。

のんのん#24
記事: 19
登録日時: 2年前

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

#38

投稿記事 by のんのん#24 » 1年前

かずま さんが書きました:
のんのん#24 さんが書きました: 0が入っている場所なんですけど、縦と横の数字が被らず、隣り合う数字の差を取ったときに数が同じにならない
ようにしたいんですけど
「隣り合う数字の差を取ったときに数が同じにならない」がよくわかりません。
具体的に、こんなのはダメだという例を示してください。
例えば
11 1 11 2 3
1 11 11 3 2

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

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

返信

“C言語何でも質問掲示板” へ戻る