Professional Documents
Culture Documents
THUẠT TOà N QUAY LUI - Bà I Toã¡n Liá T Kã Cã¡c Hoã¡n Vá
THUẠT TOà N QUAY LUI - Bà I Toã¡n Liá T Kã Cã¡c Hoã¡n Vá
Bài toán: Viết chương trình liệt kê các hoán vị của {1,2,…n}
Input
0
13
2
Ouput
0
1 123
2 132
3 213
4 231
5 312
6 321
7
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:
Để 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.
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