Từ 1 tới 5 trên tổng số 5 kết quả

Đề tài: [ Solved ]Mảng 2 chiều

  1. #1
    Ngày gia nhập
    09 2008
    Bài viết
    2

    Mặc định [ Solved ]Mảng 2 chiều

    Mọi người ơi giúp em bài này nhé:
    cho mảng nxn A chứa các số 0 và 1. Sao cho trên bất cứ hàng nào số 1 luôn đứng trước số 0. Hãy cách nhanh nhất để tìm ra hàng có nhiều sô 1 nhất.?
    thanks nhìu

  2. #2
    Ngày gia nhập
    04 2008
    Bài viết
    336

    hix... lộn đề ...
    Đã được chỉnh sửa lần cuối bởi 6220119 : 18-09-2008 lúc 08:07 AM.
    code ra gió bão

  3. #3
    Ngày gia nhập
    02 2008
    Nơi ở
    Việt Nam
    Bài viết
    577

    Theo mình hiểu cái mảng nó như này hẻm:
    Code:
    1 1 1 1 0 0
    1 0 0 0 0 0
    1 1 0 0 0 0
    Vậy bạn duyệt các dòng của mảng khi còn đúng thì tăng t gán max=0. So sanh i và max để tìm dòng nhiều 1 nhất. VD:
    Code:
    int max=0;
    for (i=1;i<m;i++)
    {
         int t=0;
         while (a[i][j++]) t++;
         if (max<t)max=t;
    }
    Nhưng cái này là làm bt, chắc chưa phải cách hay nhất.

  4. #4
    Ngày gia nhập
    09 2007
    Bài viết
    724

    Bài này cũng khá đơn giản. do tính chất của ma trận là số 1 luôn đướng trước số 0 trong hàng. do đó ứng với mỗi hàng ta chỉ đếm khi chưa gặp số 0 thôi. nếu gặp thì ra khỏi vòng for đó liền.

    đây là code zkday phác thảo thôi
    C Code:
    1. int TongDongLonNhat(int A[][MAX], int n)
    2. {
    3.    int MaxTong = 0, Tong = 0, dongMax;
    4.    for(int i=0; i<n; i++)
    5.    {
    6.         int b = 1;
    7.         for(int j=0; (flag) && (j<n); j++)
    8.         {
    9.             Tong += A[i][j];
    10.             if(A[i][j] == 0) // nếu mà gặp giá trị 0 thì bật flag lên bằng 0
    11.             {
    12.                  flag = 0;
    13.             }
    14.         }
    15.          
    16.         //kiểm tra xem dòng dòng hiện thời  có tổng có lớn hơn MaxTong hay không
    17.         if(MaxTong<Tong){
    18.            DongMax = i ; // giữ lại dòng có tổng lớn nhất hiện tại
    19.            MaxTong = Tong; // gán giá trị lớn nhất hiện tại cho thằng MaxTong giữ
    20.        }
    21.  
    22.     }
    23. }

    Mình không quen dùng break trong vòng lặp nên mình dùng thằng flag làm cờ các bạn có thể không dùng cách này mà thay vào gán flag = 0; thì có thể bỏ break ngay chổ đó.


    chúc bạn thành công.


    ps: thoáng đọc qua thì thấy code dài và không tối ưu nhưng khi làm với dữ liệu lớn(sự chênh lệch giữa số 0 hơn số 1 là rất lớn) sẽ thấy nó "phát huy tác dụng"
    Đã được chỉnh sửa lần cuối bởi zkday2686 : 18-09-2008 lúc 01:22 AM.

  5. #5
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    Tui thì nghĩ cứ đi từ bên số 0 ngược lại vào cho tới khi gặp 1 ( dòng đầu tiên ) tạm gán là max rùi đi dọc xuống, nếu thằng kế dưới = 0 khỏi check nhảy dòng vì có check cũng nhỏ hơn...vậy thì số lần tính sẽ giảm đáng kể thay vì check toàn bộ các dòng.

Các đề tài tương tự

  1. [ Solved ]Chia nhỏ chương trình C++
    Gửi bởi hahonga3 trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 4
    Bài viết cuối: 12-11-2008, 11:42 AM
  2. [ Solved ]Hỏi lại về mảng 2 chiều
    Gửi bởi RedHatLinux9 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 1
    Bài viết cuối: 29-09-2008, 02:17 PM
  3. [ Solved ]Cần giúp giùm về mảng 1 chiều
    Gửi bởi Mr.Phong trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 5
    Bài viết cuối: 04-09-2008, 08:58 PM
  4. [ Solved ]Câu hỏi về mảng hai chiều
    Gửi bởi winnguyen87 trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 4
    Bài viết cuối: 05-06-2008, 07:29 AM
  5. [Solved]Đếm số 0 trong một dòng của mảng 2 chiều
    Gửi bởi nightmare_hbt trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 5
    Bài viết cuối: 01-01-2008, 04:50 PM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn