Thắc mắc về thuật toán quay lui sinh hoán vị

Ví dụ: n = 3;
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
Em thắc mắc rằng khi ở đoạn if (k==n) sau lúc đó i = 3 rồi và Bool [3] = false;, song rồi hết vòng lặp, Mà sao nó lại chạy tiếp ạ?

int n;
int Bool[MAX] = { 0 };//Đánh dấu chưa có phần tử nào sử dụng hết
int A[MAX];//Lưu hoán vị vào mảng A
 
void xuat() {
    for (int i = 1; i <= n; i++)
        cout << A[i] << " ";
    cout << endl;
}
 
void Try(int k) {
    for (int i = 1; i <= n; i++) {
        //Kiểm tra nếu phần tử chưa được chọn thì sẽ đánh dấu
        if (!Bool[i]) {
            A[k] = i; // Lưu một phần tử vào hoán vị
            Bool[i] = 1;//Đánh dấu đã dùng
            if (k == n)//Kiểm tra nếu đã chứa một hoán vị thì xuất
                xuat();
            else
                Try(k + 1);
            Bool[i] = 0;
        }
    }
}

k==n không phải là xong, mà vẫn phải quay ngược về chạy cho hết.

p/s: cái này ko tối ưu :smiley:

2 Likes

Nó quay ngược về kiểu gì vậy ạ?

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?