ページ 11

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

Posted: 2017年11月30日(木) 01:40
by かずま
のんのん#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

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

Posted: 2017年12月01日(金) 13:35
by のんのん#24
ありがとうございます!
実行結果を以下のようにも出力させるにはどうしたらよいでしょうか?

コード:

[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]の組み合わせ.

Posted: 2017年12月01日(金) 18:28
by かずま
のんのん#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]の組み合わせ.

Posted: 2017年12月03日(日) 11:32
by かずま
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); }
で、問題は解決したのでしょぅか?

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

Posted: 2017年12月07日(木) 10:33
by のんのん#24
当初の問題は解決しました!
本当にありがとうございます。

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]の組み合わせ.

Posted: 2017年12月07日(木) 17:02
by かずま
これで、いかがでしょうか?

コード:

#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]の組み合わせ.

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

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

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

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

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