PDA

View Full Version : [pascal] dãy hoán vị



minhthang_cr
10-12-2011, 19:59
viết CT in ra màn hình tất cả các hoán vị của các số từ 1 đến n
vd : n=2
các hoán vị là :
1 2
2 1

n=3
các hoán vị là
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1

các bạn giúp giùm nhé ! tks nhìu !

HGMinh95
10-12-2011, 20:40
Bài này bạn dùng phương pháp sinh

Gọi dãy hoán vị là a[1], a[2], a[3], ... a[n]

- Khởi tạo hoán vị đầu tiên 1 2 3 ... n
- Duyệt từ cuối hoán vị lên
___ + Nếu tìm thấy phần tử i nào a[i] < a[i+1] thì hoán đổi a[i] với phần tử cuối cùng trong dãy hoán vị lớn hơn nó rồi sắp xếp lại các phần tử từ a[i+1] -> a[n] theo thứ tự tăng dần. Sau đó in dãy hoán vị vừa thu được
___ + Nếu ko tìm được phần tử i nào như vậy, -> đã hết các hoán vị -> kết thúc chương trình.

1hakunamatata
11-12-2011, 22:10
rõ hơn nào bạn Minh.hì. mình không hiểu lắm. và nếu làm thế này cho hoán vị một số cho trước được không?

HGMinh95
13-12-2011, 20:39
rõ hơn nào bạn Minh.hì. mình không hiểu lắm. và nếu làm thế này cho hoán vị một số cho trước được không?
VD vs dãy 123 nhé
- Khởi tạo hoán vị đầu tiên 123
- Tìm phần tử a[i] cuối cùng t/m a[i]<a[i+1] -> phần tử đó là a[2]=2
- Tìm phần tử a[j] cuối cùng trong dãy lớn hơn a[2] -> phần tử đó là a[3]=3
- Hoán đổi a[3] và a[2] rồi sắp xếp các phần tử từ a[2] -> a[n] theo thứ tự tăng dần được dãy hoán vị mới là 132
... Làm tương tự cho -> khi ko tìm được a[i]