Một số bài toán khác
Bài toán: Liệt kê các dãy có chiều dài n dưới dạng x 1 x 2 ...x n , trong đó xi €{ 0,1 }. Phân tích, thiết kế thuật toán: Ta có thể sử dụng sơ đồ tìm tất cả các lời giải của bài toán. ...
Bài toán:
Liệt kê các dãy có chiều dài n dưới dạng x1x2...xn , trong đó xi €{ 0,1 }.
Phân tích, thiết kế thuật toán:
Ta có thể sử dụng sơ đồ tìm tất cả các lời giải của bài toán. Hàm Try(i) xác định xi, trong đó xi chỉ có 1 trong 2 giá trị là 0 hay 1. Các giá trị này mặc nhiên được chấp nhận mà không cần phải thoả mãn điều kiện gì. Nên Hàm try(i) có thể viết như sau :
Try ( i) ≡
{
for (j = 0; j <= 1; j++)
{
x[i] = j;
if (i < n )
Try (i+1);
else
Xuất(x);
}
}
Cây không gian các trạng thái của bài toán có thể mô tả bởi
Bài toán:
Liệt kê hoán vị của n số nguyên dương đầu tiên
Phân tích, thiết kế thuật toán:
Ta biểu diễn các hoán vị dưới dạng a1 ... an ; ai €{1,..,n} và ai ≠ aj nếu i ≠j. Với mọi i, ai chấp nhận giá trị j nếu j chưa được sử dụng, và vì vậy ta cần ghi nhớ j đã được sử dụng hay chưa khi quay lui. Để làm điều này ta dùng một dãy các biến logic bj với quy ước :
Sau khi gán j cho ai , ta cần ghi nhớ cho bj ( bj = 0) và phải trả lại trạng thái cũ cho bj ( bj = True) khi thực hiện việc in xong một hoán vị. Ta chú ý rằng dãy các biến bj sẽ được khởi động bằng 1
Thuật toán có thể viết như sau :
Try( i)
{
for ( j = 1; j <= n; j++)
if ( b[j])
{
a[i] = j;
b[j] = 0; // Ghi nhận trạng thái mới
if (i < n)
Try(i+1);
else
Xuất();
b[j] = True; // Trả lại trạng thái cũ
}
}
Bài toán:
Liệt kê các tổ hợp chập k của n phần tử
Phân tích, thiết kế thuật toán:
Ta sẽ biểu diễn tổ hợp dưới dạng x1...xk ; Trong đó :
1<= x1, x2, …, xn <= n
Ta nhận xét rằng với mọi j €{1,..n}: xi chấp nhận j ≡ j €{ ci-1+1, . ., n-k+i}.Các giá trị j thỏa điều kiện trên mặc nhiên được chấp nhận, nên ta không cần dùng các biến booole để ghi nhớ nữa.
Thuật toán có thể viết như sau :
Try( i)
for ( j = 1; j <= n ; j++)
if( x[i-1] + 1 <= j <= n - k + i )
{
x[i] = j;
if (i < k) Try(i+1);
else
Xuất(x);
}
Tìm đường đi từ đỉnh (1) đến đỉnh (4) : A(0) = {1};
A(1) = {2,3,5} A(2) = {6} A(3) = {4}
Đường đi ngắn nhất tìm được là 4 ? 6 ? 5 ? 1 , có chiều dài là 3.