Hiển thị kết quả từ 1 đến 10 / 10
  1. #1
    Tham gia
    11-04-2007
    Bài viết
    33
    Like
    0
    Thanked 0 Times in 0 Posts

    Hoán vị ...... !!! Help me ...

    Ông thầy mình cho cái đề về toán hoán vị ai giải giúp mình đi ...
    Đề : nhập vào n số thì in ra hoán vị của nó :
    Vd : 4 số 1,2,3,4 thì in ra màn hình
    1,2,3,4
    1,2,4,3
    1,3,2,4
    1,3,4,2
    1,4,2,3
    .... tiếp tục cho đến hết ... ai giúp mình với T__T mới 11 mừ chơi đề vầy chắc die
    Quote Quote

  2. #2
    Tham gia
    28-10-2007
    Bài viết
    106
    Like
    0
    Thanked 1 Time in 1 Post
    Nếu mình ko nhầm thì cái này dùng quay lui nè.

  3. #3
    Tham gia
    20-09-2007
    Bài viết
    140
    Like
    0
    Thanked 1 Time in 1 Post
    Bài này có thuật toán chuẩn đó bạn <------ cái này mình hôk nhớ nhưng cứ copy lại ( quay lui thì mệt lắm ):
    Procedure Solve;
    var i,j,k,tg,u,v,d:longint;
    a:array[1..1000] of integer;

    Begin
    d:=0;
    For i:=1 to n do a[i]:=i;
    repeat
    Inc(d);
    for i:=1 to n do Write(a[i],' ');
    Writeln;
    i:=n-1;
    While (i>0) and (a[i]>a[i+1]) do Dec(i);
    If i>0 then
    Begin
    k:=n;
    While a[k]<a[i] do dec(k);
    tg:=a[i];
    a[i]:=a[k];
    a[k]:=tg;
    u:=i+1;
    v:=n;
    While u<v do
    Begin
    tg:=a[u];
    a[u]:=a[v];
    a[v]:=tg;
    Inc(u);
    dec(v);
    End;
    If d= 1000000 then
    begin
    For i:=1 to n do Write(a[i],' ');
    readln;
    end;
    End;
    until i=0;
    End;

  4. #4
    Tham gia
    19-02-2007
    Bài viết
    136
    Like
    0
    Thanked 1 Time in 1 Post
    (* khai báo *)
    type mang=array[1..100] of byte;
    dd=array[1..100] of boolean;
    var a:mang;
    d:dd;
    (* ct con đệ quy *)
    procedure hv(i,n:byte);
    var j:byte;
    begin
    if i>n then inkq
    else
    for j:=1 to n do
    if d[j] then
    begin
    a[i]:=j;
    d[j]:=false;
    hv(i+1,n);
    d[j]:=true;
    end;
    end;
    trong đó inkq là thủ tục in ra kết quả(xuất gt của mảng a)phần nhập n thì tự viết nhé, còn khi gọi thủ tục thì gọi hv(1,n) là đc.

  5. #5
    Tham gia
    18-11-2007
    Location
    ở HCM
    Bài viết
    697
    Like
    9
    Thanked 11 Times in 7 Posts
    cái này dùng mảng à các bác

  6. #6
    Tham gia
    11-04-2007
    Bài viết
    33
    Like
    0
    Thanked 0 Times in 0 Posts
    @Foolpro : thank bạn mình làm dc rồi ... mình có chỉnh sửa tí cho chuẩn ai thix thì sài lun ^^...
    program Solve;
    uses crt;
    var i,j,k,tg,u,v,d,n:byte;
    a:array[1..50] of integer;
    Begin
    clrscr;
    write('Nhap n =');
    read(n);
    for i:=1 to n do begin
    write('Nhap so thu ',i);
    read(a[i]);
    end;
    d:=0;
    For i:=1 to n do a[i]:=a[i];
    repeat
    Inc(d);
    for i:=1 to n do Write(a[i],' ');
    Writeln;
    i:=n-1;
    While (i>0) and (a[i]>a[i+1]) do Dec(i);
    If i>0 then
    Begin
    k:=n;
    While a[k]<a[i] do dec(k);
    tg:=a[i];
    a[i]:=a[k];
    a[k]:=tg;
    u:=i+1;
    v:=n;
    While u<v do
    Begin
    tg:=a[u];
    a[u]:=a[v];
    a[v]:=tg;
    Inc(u);
    dec(v);
    End;
    If d= 1000000 then
    begin
    For i:=1 to n do Write(a[i],' ');
    readln;
    end;
    End;
    until i=0;
    readln;
    readln;
    End.

  7. #7
    Tham gia
    11-04-2007
    Bài viết
    33
    Like
    0
    Thanked 0 Times in 0 Posts
    trước mắt là mình chỉ nhập rồi hoán vị theo thứ tự từ nhỏ đến lớn .. chỉ dc 2,3,7,8 chứ vd như 2,4,6,1 thì nó chỉ có hoán vị của 2,4,6 thôi :|

  8. #8
    tranvanho Guest
    có cần thiết phải dùng quay lui khong hả các bác

  9. #9
    Tham gia
    28-10-2007
    Bài viết
    106
    Like
    0
    Thanked 1 Time in 1 Post
    Các bạn dùng mảng cũng chạy được à?
    Hôm trước thầy mình cho làm theo quay lui mà.

  10. #10
    Tham gia
    14-08-2007
    Bài viết
    64
    Like
    0
    Thanked 0 Times in 0 Posts
    Quay lui cũng là 1 cách. Cách mọi người nói ở đây là phương pháp sinh hoán vị, thuật toán của phương pháp này là:
    Giả sử đang 1 hoán vị chưa fải là cuối, ở đây khởi trị hoán vị đầu tiên là 12..n
    _ Tìm từ fải wa fần tử i đầu tiên nhỏ hơn fần tử i+1.
    _ Tìm bên fải fần tử i xem số nào nhỏ nhất lớn hơn nó.
    _ Đổi chỗ 2 số tìm được.
    _ Lật ngược đoạn mảng từ i+1 đến cuối mảng.

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
  •