30/09/2018, 16:32

Hỏi về cách dùng 1 vòng lặp duyệt mảng 2 chiều

Đối với người biết cách dùng 1 vòng lặp duyệt mảng 2 chiều.

Mọi người cho em hỏi về cái này ạ, em mới nghe lần đầu.

Cách này làm thế nào ? Nhanh hay chậm hơn so với cách dùng 2 vòng lặp? Nên dùng cách này hay cách cũ (vì trước giờ em chưa thấy ai nói hay làm kiểu này).

Cám ơn mọi người ạ

TTmagic viết 18:47 ngày 30/09/2018

làm được, nhưng không nên làm, vì nó hại não

Gió viết 18:46 ngày 30/09/2018

Em có thể dùng 1 vòng lặp bằng cách tính chỉ số của nó theo thứ tự duyệt:
Giả sử mảng kích thước m*n
mang[i][j] <=> thứ tự = i*n+j

duyệt bằng 1 vòng for:

for (k =0;k< m*n;++k){
     i=k/n;
     j=k%n;
}
Nguyễn Minh Dũng viết 18:45 ngày 30/09/2018

Confirm là không ai “rảnh” làm như thế này nhé.

#include <stdio.h>

int main()
{
        int arr[3][3] = {
                {1, 2, 3},
                {4, 5, 6},
                {7, 8, 9}
        };

        // Print value using double for loop
        for(int i = 0; i < 3; ++i) {
                for(int j = 0; j < 3; ++j) {
                        printf("%d ", arr[i][j]);
                }
                printf("\n");
        }

        // Print address using double for loop
        for(int i = 0; i < 3; ++i) {
                for(int j = 0; j < 3; ++j) {
                        printf("%p ", &arr[i][j]);
                }
                printf("\n");
        }

        // Print value using single for loop
        int *pa = arr;
        for(int i = 0; i < 3*3; ++i) {
                printf("%d ", *(pa+i));
                if ( (i + 1) % 3 == 0 )
                        printf("\n");
        }

        // Print address using print address
        for(int i = 0; i < 3*3; ++i) {
                printf("%p ", pa+i);
                if ( (i + 1) % 3 == 0 )
                        printf("\n");
        }
}
nhatlonggunz viết 18:38 ngày 30/09/2018

Confirm là không ai “rảnh” làm như thế này nhé.

Là sao anh, em không hiểu ý anh nói.

Nguyễn Minh Dũng viết 18:39 ngày 30/09/2018

Ý là anh viết chương trình mẫu sử dụng một vòng lặp để lặp qua mảng 2 chiều rồi đấy, em xem thử đi.

Nhưng mà không có ai làm như vậy cả. Chương trình anh viết chỉ là demo thôi

nhatlonggunz viết 18:39 ngày 30/09/2018

Vậy mình có nên dùng cách đó không anh, và cách đó có tối ưu hơn (chạy nhanh hơn) cách 2 vòng lặp không ?

Nguyễn Minh Dũng viết 18:48 ngày 30/09/2018

Không tối ưu hơn đâu @nhatlonggunz

Mà code phức tạp, nhiều khả năng gây ra lỗi.

viết 18:47 ngày 30/09/2018

Người ta chỉ sử dụng mảng 1 chiều thay cho mảng 2 chiều và có thể dùng 1 vòng for duyệt hết cả mảng. Ví dụ đơn giản để tạo mảng 1 chiều mà sử dụng như mảng 2 chiều như thế này.

#include<iostream>
using namespace std;

// bien 
extern int const ROWS = 2;
extern int const COLS = 2;    
extern int const MATRIX[ROWS*COLS] = { 1 , 2 , 3, 4}; // thay cho mang 2x2    

// lay gia tri cua matrix theo hang va cot    
int matrix(int row, int col)
{
    assert(row >= 0 && row < ROWS);
    assert(col >= 0 && col < COLS);
    
    return MATRIX[(row*COLS) + col];    
}



int main()
{
    cout<<"matrix[0][0] = "<<matrix(0,0)<<endl;
    cout<<"matrix[0][1] = "<<matrix(0,1)<<endl;
    cout<<"matrix[1][0] = "<<matrix(1,0)<<endl;
    cout<<"matrix[1][1] = "<<matrix(1,1)<<endl;
    
    return 0;
}
Sáng Béo viết 18:42 ngày 30/09/2018

cái này trước làm mảng động 2 chiều dùng con trỏ e từng làm nè, nhưng thầy giáo hướng dẫn lại cách chạy 2 vòng for. thật ra thì 2 vòng này như nhau, đều có độ phức tạp o(n^2) nhỉ.

lâm phúc tài viết 18:43 ngày 30/09/2018

double for loop

Cho em hỏi cái trên ý nghĩa là gì ạ

nhatlonggunz viết 18:47 ngày 30/09/2018

Là 2 vòng for, dùng từ double, có nghĩa là đôi, ý muốn nói 2 vòng for đi đôi với nhau (hay ta gọi là lồng nhau)

Tự Nhiên Quên viết 18:48 ngày 30/09/2018

em cũng đang băng khoăn nên em có viết 1 bài anh dành thời gian xem được không cảm ơn anh
http://daynhauhoc.com/t/cach-nhanh-co-that-su-nhanh-trong-sap-xep-mang-2-chieu/4293

Bài liên quan
0