Trang 1 / 2 12 LastLast
Hiển thị kết quả từ 1 đến 10 / 19
  1. #1
    Tham gia
    14-01-2003
    Location
    Hanoi
    Bài viết
    77
    Like
    0
    Thanked 1 Time in 1 Post

    Sắp xếp ma trận hình xoắn ốc

    Cho 1 ma trận kích thước n x m
    Hãy sắp xếp ma trận theo hình xoắn ốc như sau
    n,m và chiều sắp xếp do user nhập vào

    VD:
    Nguồn:
    183
    476
    592

    Đích:
    123
    894
    765

    Tui ko làm nổi... cao thủ đâu... nhào zô đi.
    Quote Quote

  2. #2
    Tham gia
    04-01-2004
    Bài viết
    58
    Like
    0
    Thanked 0 Times in 0 Posts
    2 biến, 4 vòng for ! xong !

  3. #3
    Tham gia
    16-10-2003
    Location
    HCM
    Bài viết
    29
    Like
    0
    Thanked 0 Times in 0 Posts
    cái này thuộc KTLT mờ
    Yeah 4 for....

  4. #4
    Tham gia
    03-01-2004
    Bài viết
    903
    Like
    0
    Thanked 11 Times in 7 Posts
    Đi xoa('n o^'c => đi vo`ng theo chu vi 1 hi`nh chu*~ nha^.t (ki'ch thuo*'c gia?m da^`n)

    go.i m la` so^' co^.t; n la` so^' do`ng

    Ba('t đa^`u đi tu*` vi. tri' (1,1); minX=1, minY=1, maxX=m, maxY=n; đi qua pha?i

    đi qua pha?i (co^.t ta(ng da^`n) ne^'u đu.ng maxX thi` gia?m maxX đi 1 & đo^?i
    tha`nh đi xuo^'ng duo*'i

    đi xuo^'ng duo*'i (do`ng ta(ng da^`n) ne^'u đu.ng maxY thi` gia?m maxY đi 1 & đo^?i tha`nh đi qua tra'i

    đi qua tra'i (co^.t gia?m da^`n) ne^'u đu.ng minX thi` ta)ng minX the^m 1 & đo^?i
    tha`nh đi le^n tre^n

    đi le^n tre^n (do`ng gia?m da^`n) ne^'u đu.ng minY thi` ta(ng minY the^m 1 & đo^?i tha`nh đi qua pha?i

    Đi đu? (m*n) buo*'c thi` du*`ng

  5. #5
    Tham gia
    30-01-2004
    Bài viết
    4
    Like
    0
    Thanked 0 Times in 0 Posts
    Cái này la đề thi IOI từ năm 1900 lâu lắc (khoảng 80 - 88 gì đó) Nó khá dễ mà, nếu bạn cần thì mình gõ cho. Nhưng cho hỏi tí, trong VD, nguồn là gì vậy ? I don't understand !!!

  6. #6
    Tham gia
    14-01-2003
    Location
    Hanoi
    Bài viết
    77
    Like
    0
    Thanked 1 Time in 1 Post
    Là ma trận ban đầu (do user nhập vào chẳng hạn)

  7. #7
    Tham gia
    14-01-2003
    Location
    Hanoi
    Bài viết
    77
    Like
    0
    Thanked 1 Time in 1 Post
    Theo cách của bete, tui đã làm thành công... nhưng hơi dài dòng. Nghe unfriendlyboy
    nói thì có vẻ tối ưu quá, vậy sao không post code lên mọi người xem với

    Cách của tui:

    var temp: array[1..100]of byte;
    a: array[1..10,1..10]of byte;
    i,j,k,n,m, minX,minY,maxX,maxY,h:byte;

    procedure View;
    begin
    {Hien thi ma tran}
    for i:=1 to n do
    begin
    for j:=1 to m do
    begin
    write(a[i,j]:8);
    end;
    writeln;
    writeln;
    end;
    end;

    begin
    write('Nhap so hang n:');readln(n);
    write('Nhap so cot m:');readln(m);
    write('Ban muon nhap du lieu cho ma tran hay muon chuong trinh tu tao ra? [1,0]');readln(i);
    if i=0 then {Tu dong tao ra}
    begin
    randomize;
    for i:=1 to n do
    for j:=1 to m do
    begin
    a[i,j]:=random(999);
    end;
    end
    else
    begin
    for i:=1 to n do
    for j:=1 to m do
    begin
    write('a[',i,',',j,']: ');readln(a[i,j]);
    end;
    end;
    Writeln('Ma tran ban dau:');
    View;
    {Chuyen sang mang 1 chieu temp}
    for i:=1 to n do
    for j:=1 to m do
    begin
    k:=k+1;
    temp[k]:=a[i,j];
    end;

    {Sap xep mang temp}
    for i:=1 to m*n-1 do
    for j:=i+1 to m*n do
    if temp[i]>temp[j] then
    begin
    k:=temp[i];
    temp[i]:=temp[j];
    temp[j]:=k;
    end;

    {Chuyen mang Temp thanh ma tran}
    minX:=1;
    minY:=2;
    maxX:=m;
    maxY:=n;
    i:=1;
    j:=0;
    h:=1;
    for k:=1 to m*n do
    begin
    if h=1 then j:=j+1;{right}
    if h=2 then i:=i+1;{down}
    if h=3 then j:=j-1;{left}
    if h=4 then i:=i-1;{up}
    a[i,j]:=temp[k];
    if (j=maxX)and(h=1) then{->down}
    begin
    maxX:=maxX-1;
    h:=2;
    end;
    if (j=minX)and(h=3) then{->up}
    begin
    minX:=minX+1;
    h:=4;
    end;

    if (i=maxY)and(h=2) then{->left}
    begin
    maxY:=maxY-1;
    h:=3;
    end;
    if (i=minY)and(h=4) then{->right}
    begin
    minY:=minY+1;
    h:=1;
    end;

    end;
    Writeln('Ma tran sau khi sap xep:');
    View;
    readln;
    end.

  8. #8
    Tham gia
    01-12-2003
    Location
    HCM
    Bài viết
    54
    Like
    0
    Thanked 1 Time in 1 Post
    hình như là như vậy :
    đầu tiên bạn nhập giá trị bất kì vào ma trận(m x m),
    sắp xếp các giá trị đó -> có thể bạn chép giá trị của ma trận vào 1 mảng
    cuối cùng là xuất ma trận theo hình xoán ốc -> kỹ thuật lập trình

  9. #9
    Tham gia
    03-01-2004
    Bài viết
    903
    Like
    0
    Thanked 11 Times in 7 Posts
    boyalone cho góp ý 1 tí nhé:

    if h=1 then j:=j+1;{right}
    if h=2 then i:=i+1;{down}
    if h=3 then j:=j-1;{left}
    if h=4 then i:=i-1;{up}

    nên sửa là

    if h=1 then j:=j+1 {right}
    else if h=2 then i:=i+1 {down}
    else if h=3 then j:=j-1 {left}
    else if h=4 then i:=i-1 {up}

    tương tự:

    if (j=maxX)and(h=1) then{->down}
    ........
    else if (j=minX)and(h=3) then{->up}
    ........
    else if (i=maxY)and(h=2) then{->left}
    ........
    else if (i=minY)and(h=4) then{->right}

    vì mình có 1 vòng lặp for

    Đô'i với bài này co thể nó 0 giúp chương trình chạy nhanh hơn gì nhưng đó là 1 thói
    quen lập trinh tô't

    1 cách nữa để đơn giản hóa

    if h=1 then j:=j+1 {right}
    else if h=2 then i:=i+1 {down}
    else if h=3 then j:=j-1 {left}
    else if h=4 then i:=i-1 {up}

    là khai báo 2 mảng:
    dx = 0, 1, 0, -1
    dy = 1, 0, -1, 0

    và xài:

    i := i + dx[h];
    j := j + dy[h];


  10. #10
    Tham gia
    04-01-2004
    Bài viết
    58
    Like
    0
    Thanked 0 Times in 0 Posts
    Cách làm này của bạn chưa được hay lắm. Để mình post cách làm của mình nên nghen. Chờ 1 tí

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
  •