30/09/2018, 16:12

In ra mảng ziczac

Mình mới nhập môn có bài deadline về hàm lặp như thế này:
Làm sao để suất ra:
1 10 11 20 21
2 9 12 19 22
3 8 13 18 23
4 7 14 17 24
5 6 15 16 25

Từ facebook

Nguyễn Minh Dũng viết 18:13 ngày 30/09/2018
#include <stdio.h>
#include <stdlib.h>

#define MAX 10

int chan(int n)
{
    return n % 2 == 0;
}

int main()
{
    int size = 5;
    int arr[MAX][MAX] = {};
    for(int cot = 0; cot < size; ++cot)
        for(int hang = 0; hang < size; ++hang)
            if (chan(cot))
                arr[hang][cot] = hang + cot*size + 1;
            else
                arr[hang][cot] = (cot+1)*size - hang;

    for(int hang = 0; hang < size; ++hang)
    {
        printf("\n");
        for(int cot = 0; cot < size; ++cot)
            printf("%3d ", arr[hang][cot]);
    }

    return 0;
}

Sửa biến size = 10 sẽ in ra được

  1  20  21  40  41  60  61  80  81 100
  2  19  22  39  42  59  62  79  82  99
  3  18  23  38  43  58  63  78  83  98
  4  17  24  37  44  57  64  77  84  97
  5  16  25  36  45  56  65  76  85  96
  6  15  26  35  46  55  66  75  86  95
  7  14  27  34  47  54  67  74  87  94
  8  13  28  33  48  53  68  73  88  93
  9  12  29  32  49  52  69  72  89  92
 10  11  30  31  50  51  70  71  90  91
TTmagic viết 18:19 ngày 30/09/2018

hại não ghê
a thử mô tả thuật toán đi

Nguyễn Minh Dũng viết 18:18 ngày 30/09/2018
  • Duyệt cột > hàng
    for(int cot = 0; cot < size; ++cot)
    for(int hang = 0; hang < size; ++hang)

  • nếu cột chẵn (0, 2, 4, …)
    thì arr[hang][cot] = hàng + cột * size + 1

  • nếu cột lẻ (1,3, 5, …)
    thì arr[hang][cot] = (cột +1) * size - hàng

Anh nhìn vào cái đề thì anh thấy có sự liên quan như vậy thôi mà, em để ý thử đi.

  1  20  21  40  41  60  61  80  81 100
  2  19  22  39  42  59  62  79  82  99
  3  18  23  38  43  58  63  78  83  98
  4  17  24  37  44  57  64  77  84  97
  5  16  25  36  45  56  65  76  85  96
  6  15  26  35  46  55  66  75  86  95
  7  14  27  34  47  54  67  74  87  94
  8  13  28  33  48  53  68  73  88  93
  9  12  29  32  49  52  69  72  89  92
 10  11  30  31  50  51  70  71  90  91
Thực tế khắc nghiệt viết 18:25 ngày 30/09/2018

Anh nhìn vào cái đề thì anh thấy có sự liên quan như vậy thôi mà, em để ý thử đi.

1  a[0][0] 10   a[0][1]  11  a[0][2]  20  a[0][3]  21  a[0][4]
2  a[1][0]  9   a[1][1]  12  a[1][2]  19  a[1][3]  22  a[1][4]
3  a[2][0]  8   a[2][1]  13  a[2][2]  18  a[2][3]  23  a[2][4]
4  a[3][0]  7   a[3][1]  14  a[3][2]  17  a[3][3]  24  a[3][4]
5  a[4][0]  6   a[4][1]  15  a[4][2]  16  a[4][3]  25  a[4][4]

theo công thức của a Đạt ta sẽ cho for chạy từng cột chứ không phải chạy hàng ngang như thông thường.

Đối với cột là chẵn tính từ cột 0-> cột 4
ta có giá trị cột 4 (a[0][4] ) : 21 = (hàng,cột, size) thực hiện. 21 = 21 - 20 ( 4 *5 ) thấy có 4=cột và 5 bằng size thiếu 1 thì ta + thêm 1, thiếu hàng + hàng = 0 =>cột chẵn = cột * size + 1 + hang

Đối với cột là lẻ tính từ cột 0-> cột 3
ta có giá trị cột 3( a[0][3] ) : 20 = (hàng, cột, size) thực hiện 20 => trong phép tính cột chẵn ta thấy xuất hiện cột, size, phép nhân và số 1. tương tự ta có : cột lẻ = (cột size hàng 1 ) => 0 + 1-3-5 = 20 vậy
cột lẻ 20 = (1+3)*5 + 0 = (1+ số cột) *size + hàng

Tiếp theo là duyệt mảng lại lần cuối chèn khoảng trắng và xuống hàng!!!
suy nghĩ cả nửa tiếng mới hiệu cách nó chạy. Hại não

Bài liên quan
0