Download as docx, pdf, or txt
Download as docx, pdf, or txt
You are on page 1of 3

THUẬT TOÁN QUAY LUI

Bài toán: Viết chương trình liệt kê các hoán vị của {1,2,…n}

 Input

13

 Ouput
0  
1 123
2 132
3 213
4 231
5 312
6 321
7  

Hướng dẫn giải bài toán liệt kê hoán vị tổ hợp

Sử dụng phương pháp quay lui để giải quyết bài toán

Ta sẽ dùng một mảng A[n+1] lưu các hoán vị, khi đó các hoán vị sẽ được
biểu diễn như sau:

A[1], A[2], A[3],…,A[n].

Trong đó A[i] ≠ A[j] với mọi i,j €[1,n] và i≠j

Để xác nhận một phần tử chỉ được dùng 1 lần ta sẽ dùng mảng Bool để đánh
dấu. Nếu phần tử chưa sử dụng thì sẽ có giá trị là 0 ngược lại sẽ có giá trị 1.
Ban đầu ta khởi tạo tất cả các phần tử trong mảng đều có giá trị là 0

Ý tưởng của phương pháp quay lui là chúng ta chọn ra một phần tử chưa sử
dụng. Lưu phần tử đó vào một cấu hình tổ hợp, sau đó đánh dấu nó đã sử
dụng. Ta sẽ lặp lại công việc như trên đến khi đủ cấu hình cho một tổ hợp thì
sẽ xuất hiện ra màn hình. Sau khi xuất ra ta lại quay trở lại bước trước đó để
đánh dấu là nó chưa được chọn.

Ta có thể hình dung bài toán như hĩnh vẽ sau:


Với n=3 thì bài toán trở thành liệt kê các hoán vị các phần tử {1,2,3}. Các
hoán vị được liệt kê theo thứ tự từ điển tăng dần như hình vẽ sau:

Code gợi ý:
0  
1 #include<iostream>
2 #define MAX 20
3 using namespace std;
4  
5 int n;
6 int Bool[MAX] = { 0 };//Đánh dấu chưa có phần tử nào sử dụng hết
7 int A[MAX];//Lưu hoán vị vào mảng A
8  
9 void xuat() {
10     for (int i = 1; i <= n; i++)
11         cout << A[i] << " ";
12     cout << endl;
13 }
14  
15 void Try(int k) {
16     for (int i = 1; i <= n; i++) {
17         //Kiểm tra nếu phần tử chưa được chọn thì sẽ đánh dấu
18         if (!Bool[i]) {
19             A[k] = i; // Lưu một phần tử vào hoán vị
20             Bool[i] = 1;//Đánh dấu đã dùng
21             if (k == n)//Kiểm tra nếu đã chứa một hoán vị thì xuất
22                 xuat();
23             else
24                 Try(k + 1);
25             Bool[i] = 0;
26         }
27     }
28 }
29  
30 int main() {
31     cout << "Mhap n: ";
32     cin >> n;
33     Try(1);
34 }
35  
0  
1 Nhap n: 3
2 123
3 132
4 213
5 231
6 312
7 321
8  

You might also like