-
11-29-2010, 03:53 AM #1
Junior Member
- Ngày tham gia
- Nov 2015
- Bài viết
- 9
Tìm tất cả các hoán vị của 1 dãy số
Hihi mình thí cái nỳ cũng hay ai có thuật toán gì hay code mách mình với nhá ! Thaks các đồng chí [IMG]data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAA l21bKAAAAA1BMVEXh5PJm+yKVAAAAAXRSTlMAQObYZgAAAApJR EFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII=[/IMG] [IMG]data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAA l21bKAAAAA1BMVEXh5PJm+yKVAAAAAXRSTlMAQObYZgAAAApJR EFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII=[/IMG]
-
11-29-2010, 03:58 AM #2
Silver member
- Ngày tham gia
- Jan 2016
- Bài viết
- 9
Trong quyển DSAP của thầy Lê Minh Hoàng có cái này rồi, trong phương pháp sinh liệt kê các hoán vì. Nhưng code đó của thầy hình như là liệt kê các hoán vị từ 1->n, bạn phải sửa đổi 1 chút đối với dãy số, đặc biệt với dãy các số có thể bằng nhau thì cần nghĩ thêm 1 chút nữa mới được.
-
11-29-2010, 04:13 AM #3
Junior Member
- Ngày tham gia
- Aug 2015
- Bài viết
- 7
Àhh mình tìm thấy rồi _ _! nhìn nhìu chữ ngán thế ko biết hzjzzz _ _!
-
11-29-2010, 05:03 AM #4
Junior Member
- Ngày tham gia
- Aug 2015
- Bài viết
- 2
Bài này còn 1 cách nữa là dùng đệ qui quay lui.
e lấy lại bài lớp 10 nên có nhiều sơ sót nha a Ginta! (e sẽ sửa lại sau).
uses crt;
var a:array [1..100] of byte;
b:array [1..100] of 0..1;
c:array[1..100] of byte;
d,i,j,n:byte;
procedure nhap;
begin
for i:=1 to n do
begin
write('pt ',i,' : ');readln(c);
end;
end;
procedure xuat;
begin
for i:=1 to n do
write(a:5);
writeln;
inc(d);
end;
procedure find(i:byte);
var j:byte;
begin
if i>n then xuat
else
begin
for j:=1 to n do
if b[j]=1 then
begin
a:=c[j];
b[j]:=0;
find(i+1);
b[j]:=1;
end;
end;
end;
begin
clrscr;
write('nhap n: ');readln(n);
d:=0;
fillchar(b,sizeof(b),1);
nhap;
find(1);
write(d);
readln;
end.
-
12-03-2010, 03:52 AM #5
Senior Member
- Ngày tham gia
- Oct 2015
- Bài viết
- 228
Em kiểm tra lại điều kiện nhé, vì code này chạy sai trong trường hợp dãy có các phần tử bằng nhau. [IMG]data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAA l21bKAAAAA1BMVEXh5PJm+yKVAAAAAXRSTlMAQObYZgAAAApJR EFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII=[/IMG] Còn trường hợp khác nhau anh chưa test được kĩ, nhưng chắc là ok
-
12-03-2010, 05:15 AM #6
Silver member
- Ngày tham gia
- Mar 2016
- Bài viết
- 6
Gửi bởi Ginta_ITFam
-
12-05-2010, 04:25 AM #7
Junior Member
- Ngày tham gia
- Nov 2015
- Bài viết
- 0
Cái code trên bác dùng thuật toàn ntn vậy :-S Trình bày cho e hiễu cái ngả thks !!
-
12-05-2010, 05:27 AM #8
Junior Member
- Ngày tham gia
- Aug 2015
- Bài viết
- 2
Gửi bởi sangpronhat
Bài này dùng quay lui rồi đánh dấu là được:
Mã:procedure bt(k:byte); var i:byte; begin for i:=1 to n do if not dd[i] then begin dd[i]:=true; luu[k]:=a[i]; if k=n then PRINT else bt(k+1); dd[i]:=false; end; end;
Mảng dd có tác dụng đánh dấu phần tử thứ i trong mảng có sử dụng trong bộ nghiệm hay chưa, mảng luu để lưu lại phần tử đã chọn.
Thủ tục PRINT để in ra [IMG]data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAA l21bKAAAAA1BMVEXh5PJm+yKVAAAAAXRSTlMAQObYZgAAAApJR EFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII=[/IMG]
P/s: Không chạy được với n=0. Cần thêm điều kiện.
Theo điều tra tình hình sử dụng thuốc lá ở người trưởng thành năm 2020 do Bộ Y tế triển khai, ngày nay tỷ lệ đàn ông Việt Nam hút thuốc đang ở mức 42,3%. Không chỉ có khả năng gây ung thư và một...
Những thói quen khiến "cuộc vui" của hai người trở nên... dở dang