Trang 1 / 2 12 LastLast
Hiển thị kết quả từ 1 đến 10 / 13
  1. #1
    Tham gia
    17-09-2007
    Bài viết
    333
    Like
    0
    Thanked 0 Times in 0 Posts

    Nhờ giúp đỡ về thuật toán có liên quan đến mà trận

    Mình được rao một bài tập mà nghĩ mãi không ra, mong các bạn giúp đỡ
    Đề bài: Nhập vào một số n (n là kích thước của một ma trận vuông) và nhập các phần tử cho ma trận đó. Hãy xây dựng thuật toán để in ma trận ra màn hình với điều kiện mà trận in ra phải là ma trận hình xoáy chôn ốc
    Ví dụ về ma trận xoáy trôn ốc
    Code:
     1      2     3     4
    12     13     14    5
    11     16     15    6
    10      9     8     7
    Mong các bạn giúp đỡ
    Thanks!!!!!!!!!!!!!!!!
    Quote Quote

  2. #2
    Tham gia
    28-12-2008
    Bài viết
    106
    Like
    0
    Thanked 0 Times in 0 Posts
    Ma trận in ra theo thứ tự tăng dần (dọc theo đường xoắn ốc) của các phần tử nhập vào phải ko bạn?
    mình ko hiểu rõ đề bài lắm.Bạn nên cho 1 ví dụ cụ thể.
    Ví dụ ta nhập vào n=3, sau đó nhập lần lượt các giá trị ma trận là:
    1 6 9 50 12 56 77 33 22
    thì kết quả xuấ ra màn hình là gì?

  3. #3
    Tham gia
    10-05-2009
    Bài viết
    353
    Like
    23
    Thanked 24 Times in 24 Posts
    bài này khủng, nhai hơi vất, nhìn mãi hok thấy qui luật j hết. hjx, bạn lấy bài tập này ở đâu vậy. nếu dùng tọa độ định vị còn có khả năng, chứ không dùng tọa độ nhìn hok ra qui luật, mà tọa độ cũng hok khác mấy, nhai vất

  4. #4
    Tham gia
    31-03-2010
    Bài viết
    3
    Like
    0
    Thanked 0 Times in 0 Posts
    mình chịu thui
    mình còn chưa hình dung cái ma trận ấy ntn nữa
    hix....................

  5. #5
    Tham gia
    23-09-2008
    Bài viết
    64
    Like
    0
    Thanked 0 Times in 0 Posts
    Quote Được gửi bởi vanquyenhp View Post
    Mình được rao một bài tập mà nghĩ mãi không ra, mong các bạn giúp đỡ
    Đề bài: Nhập vào một số n (n là kích thước của một ma trận vuông) và nhập các phần tử cho ma trận đó. Hãy xây dựng thuật toán để in ma trận ra màn hình với điều kiện mà trận in ra phải là ma trận hình xoáy chôn ốc
    Ví dụ về ma trận xoáy trôn ốc
    Code:
     1      2     3     4
    12     13     14    5
    11     16     15    6
    10      9     8     7
    Mong các bạn giúp đỡ
    Thanks!!!!!!!!!!!!!!!!
    Chắc bạn phải lấy ví dụ khác có cả số có 3, 4 chữ số cho các bạn còn tìm ra quy luật chứ.

  6. #6
    Tham gia
    10-05-2009
    Bài viết
    353
    Like
    23
    Thanked 24 Times in 24 Posts
    ai làm được rồi post lên mọi người tham khảo, aj mà tự làm được bài này, hok hỏi thầy cô, hok hỏi aj hết, thì mình rất ngưỡng mộ, nếu hok aj giải được có lẽ đây là bài hok lời giải

  7. #7
    Tham gia
    17-09-2007
    Bài viết
    333
    Like
    0
    Thanked 0 Times in 0 Posts
    Mà trận là như thế này
    Nhập vào n là kích thước của ma trận vuông, VD n=3 thì có 3 hàng,3 cột;n=4 thì có 4 hàng, 4 cột.
    Sau đó nhập vào các phần tử của ma trận đó. Ví dụ n=3 (3 hàng, 3 cột) thì có 9 phần tử, ví dụ các phần tử của ma trận 1,3,4,5,6,7,9,22,33
    Code:
    1     3     4
    22    33    5    
    9     7     6

  8. #8
    Tham gia
    28-12-2008
    Bài viết
    106
    Like
    0
    Thanked 0 Times in 0 Posts
    Đầu tiên ta ánh xạ mỗi phần tử của ma trận cho tập chỉ số index {1,2,3...,n^2}. theo thứ tự tăng dần (phần tử nhỏ nhất có index là 1 và phần tử lớn nhất có index là n^2). Như vậy lúc này ta chỉ đơn giản là làm việc trên các index từ 1 đến n^2.
    -hàng đầu tiên: in lần lượt các phần tử có index từ 1 đến n.
    -hành cuối cùng: in lần lượt các phần tử có index từ 3n-2 đến 2n-1.
    *khó là các hàng thứ 2 đến thứ n-1. Làm theo quy luật sau:
    - Các phần tử đầu tiên của các hàng này có index là: Index(a[i][0])=4n-3-i (i=1,2,...,n-2).
    - Các phần tử tiếp theo của các hàng này (trừ phần tử cuối)sẽ có index tăng dần:
    Index(a[i][j])=Index(a[i][j-1])+1 (i=1,2...,n-2 và j=1,2...,n-2).
    - Phần tử cuối của các hàng này có index là: Index(a[i][n-1])=n+i (i=1,2,...,n-2).

    Đó là quy luật, mọi người cứ theo đó rồi tạo các vòng for tương ứng sẽ ok. Good Luck!
    -

  9. #9
    Tham gia
    10-05-2009
    Bài viết
    353
    Like
    23
    Thanked 24 Times in 24 Posts
    hi! nhìn qua thì đúng được 80%, nhưng như thế vẫn sai bạn ơi
    ví dụ.
    ---------------------------
    01....02....03....04....05
    16....17....18....19....06
    15....24....25....20....07
    14....23....22....21....08
    13....12....11....10....09
    ----------------------------
    làm theo thuật toán như vậy hàng thứ 4 sẽ sai. như vậy bạn làm vẫn là điểm 0, chúc mừng bạn.
    có aj có thuật toán bài ny` hok, mình bức xúc quá, hok giải đc bài ny`

    [=========> Bổ sung bài viết <=========]

    ak`. đúng oy`, mình sẽ thêm vào thuật toán của bạn kia là:
    từ các dòng thứ 0 đến i( với i = n/2 nếu chẵn, i = (n+1)/2) thì index tăng dân như bạn đã nói, nhưng từ i+1 đến n-1 thì thay vì tăng dần chúng ta cho index giảm dần, vậy là ok, hihi. bài ny` kết thúc/

    [=========> Bổ sung bài viết <=========]

    hjx, nhầm thế cũng không được nhìn thấy hàng thứ 3 bik là sai nữa rồi,
    vẫn chưa xong bài ny`
    Được sửa bởi anh2604 lúc 11:45 ngày 02-04-2010 Reason: Bổ sung bài viết

  10. #10
    Tham gia
    28-12-2008
    Bài viết
    106
    Like
    0
    Thanked 0 Times in 0 Posts
    ok mình nhầm tí bạn.
    Bạn giai theo ý tưởng này.
    Bạn để ý thấy rằng nếu ma trận xoắn ốc cấp n, khi ta bỏ các giá trị bên ngoài viền của nó thì ta lại được 1 ma trận xoắn ốc cấp n-2. (Ý tưởng đệ quy ở đây rùi hii).
    Sau đây là code mình viết bằng C, chạy rất tốt, mình test rồi, bạn lấy mà tham khảo.
    #include<conio.h>
    #include<iostream>
    using namespace std;
    int n_max;
    int* index_matrix; /*ma tran chua cac index dung thu tu=> chi can in ra ma tran index nay*/
    void tinh_index_matrix(int start_i,int start_j,int start_index, int n)
    {
    if(n==1)
    {
    index_matrix[start_i*n_max+start_j]=start_index;
    return;
    }
    else if(n==2)
    {
    index_matrix[start_i*n_max+start_j]=start_index;
    index_matrix[start_i*n_max+start_j+1]=start_index+1;
    index_matrix[(start_i+1)*n_max+start_j]=start_index+3;
    index_matrix[(start_i+1)*n_max+start_j+1]=start_index+2;
    return;
    }
    else if(n<1)
    return;

    //gan cho cac vien ngoai cua index_matran

    /*for(int j=0;j<n;j++) //gan cho cac vien ngoai cua index_matran
    index_matrix[start_i][j+start_j]=start_index+j; //vien ben tren
    for(j=1;j<n;j++)
    index_matrix[start_i+j][start_j+n-1]=index_matrix[start_i][start_j+n-1]+j; //vien ben phai
    for(j=0;j<n-1;j++)
    index_matrix[start_i+n-1][start_j+j]=index_matrix[start_i+n-1][start_j+n-1]+n-1-j; //vien ben duoi
    for(j=1;j<n-1;j++)
    index_matrix[start_i+j][start_j]=index_matrix[start_i+n-1][start_j]+n-1-j; //vien ben trai
    */
    //doan comment tren quy doi ra nhu code ben duoi

    for(int j=0;j<n;j++)
    index_matrix[start_i*n_max+j+start_j]=start_index+j; //vien ben tren
    for(j=1;j<n;j++)
    index_matrix[(start_i+j)*n_max+start_j+n-1]=index_matrix[start_i*n_max+start_j+n-1]+j; //vien ben phai
    for(j=0;j<n-1;j++)
    index_matrix[(start_i+n-1)*n_max+start_j+j]=index_matrix[(start_i+n-1)*n_max+start_j+n-1]+n-1-j; //vien ben duoi
    for(j=1;j<n-1;j++)
    index_matrix[(start_i+j)*n_max+start_j]=index_matrix[(start_i+n-1)*n_max+start_j]+n-1-j; //vien ben trai

    int start_index_new=4*n-4+start_index;
    tinh_index_matrix(start_i+1,start_j+1,start_index_ new,n-2);
    }

    void main()
    {
    char tl;
    do
    {
    cout<<"nhap vao n=";
    cin>>n_max;
    int m=n_max*n_max;
    index_matrix=new int[m];
    tinh_index_matrix(0,0,1,n_max) ;

    for(int i=0;i<n_max;i++) //moi hang
    {
    for (int j=0;j<n_max;j++)
    cout<<index_matrix[i*n_max+j]<<"\t";
    cout<<"\n";
    }
    cout<<"ban co muon tiep tuc ko?(Y/N)"<<endl;
    cin>>tl;
    }
    while((tl!='k')&&(tl!='k'));
    }

    Yêu cầu nhập vào n rồi sẽ in ra ma trận xoắn ốc theo thứ tự các index tăng dần từ 1 đến n^2.
    Ý tưởng là hàm:
    void tinh_index_matrix(int start_i,int start_j,int start_index, int n);
    sẽ gán các giá trị index {1,2...n^2} vào các vị trí tương ứng của mảng index_matrix. Rồi hàm main() chỉ việc print ra các giá trị trong mảng index_matrix đó.
    *ý nghĩa của các đối số:
    +int start_i và int start_j : xác định vị trí bắt đầu của ma trận con cấp (n-2) ứng với mảng index_matrix.
    +int start_index: index đầu tiên của ma trận con.
    +int n: Ma trận vuông cấp n.


    Bạn cần phải làm thêm 1 công việc là ánh xạ các giá trị index trong mảng index_matrix vào các giá trị thực mà người dùng nhập cho ma trận, rùi in ma trận đó ra là ok.
    Được sửa bởi levanphong7887 lúc 17:44 ngày 02-04-2010

Trang 1 / 2 12 LastLast

Bookmarks

Quy định

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