Hỏi cách giải khác và cách tư duy giải những bài mảng 2 chiều như thế này

Đề bài:


Đây là bài giải của em.

#include <iostream>
#include <stdio.h>
using namespace std;
#define MAX 20

int main()
{
    int a[MAX][MAX];
    int n;
    do{
        cout <<" Nhap n : ";
        cin >> n;
    }while ( n<=0 || n>=10);
    for ( int i = 0 ; i < n ; i++){
        for (int j=0; j<n;j++){
                a[i][j]=j+i+1;
        }
    }
    int k = 1;
    for ( int i = n-1 ; i>0; i--){
        for (int j=n-1; j>n-i-1;j--){
                a[i][j]=i-j+k;
        }
        k+=2;
    }
    for ( int i = 0 ; i < n ; i++){
        for (int j=0; j<n;j++){
               cout << a[i][j]<<"\t";
        }
        cout<<endl;
    }
    return 0;
}

Em bị tốn nhiều thời gian khi suy nghĩ theo cách này. Nhờ mọi người chỉ cách làm khác và tư duy giải nhanh hơn đối với những bài thế này ạ. Em cảm ơn

Dòng thứ i (index start at 1) bắt đầu điền i và tăng dần đến n rồi lại giảm xuống
Dòng 1 => 1 2 3 4 5
Dòng 2 => 2 3 4 5 4

Tổng quát
Dòng x => x, x+1, …, n, n-1,…

4 Likes

Cách dùng i + j + 1 (x) là ổn rồi.
Để ý rằng, nếu x lớn hơn n thì các giá trị phía sau sẽ bằng 2n - x.

Thêm 1 điều kiện vào vòng lặp lồng thứ nhất là xong. Kiểu:

a[i][j] = i + j + 1;
if(a[i][j] > n){
    a[i][j] = 2 * n - a[i][j];
}

Bài này yêu cầu in ra thôi thì cũng không cần dùng mảng, chỉ cần in trực tiếp luôn cũng được.
Dùng toán và toán tử điều kiện thì không cần dùng đến if luôn.

4 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?