Đệ quy quay lùi

3 2.6K 82
Đệ quy quay lùi

Đang tải... (xem toàn văn)

Thông tin tài liệu

Đệ quy quay lùi

Giải thuật đệ quy quay lui với bài toán sắp xếp ô chữ thuật ngữVõ Công ChươngCácbạn đã từng gặp và giải đáp các ô chữ thuật ngữ thường xuất hiện trên các tạp chí và các cuộc thi. Bạn cũng có thể tạo ra được một ô chữ thuật ngữ như thế để giúp vui trong một cuộc thi nho nhỏ ở trường. Tuy nhiên, vấn đề đặt ra là khi đã có trong tay các từ hàng ngang, bạn không dễ để sắp xếp chúng trở thành một ô chữ theo từ hàng dọc. Bài viết này xây dựng giải thuật để tìm tấtcả các phương án sắp xếp các từ hàng ngang theo từ hàng dọc cho trước,giúp bạn tạo ra một trò chơi ô chữ thuật ngữ như mong muốn. 1.Bài toán: Chon Từ hàng ngang và một Từ hàng dọc có k kí tự. Hãy tìmtất cả các phương án xây dựng ô chữ thuật ngữ với các Từ hàngngang đã cho theo Từ hàng dọc ấy. Ví dụ: Ta có 10 Từ để tạo các hàng ngang: PROGRAM,USES, CRT, UNIT, LABEL, REAL, BYTE, CHAR, BEGIN, END. Từ > hàng dọc là PASCAL. Ta có tất cả 4 phươngán sắp xếp ô chữ như sau: Vớibài toán này, ta dùng giải thuật đệ quy quay lui để vét cạn các phươngán. 2. Giải thuật đệ quy quay lui tổng quát: {Tìm bước đi thứ i cho phương án} Begin FOR [mỗi cách đi] DO IF [chấp nhận được] THEN Begin [Thực hiện bước đi];IF [Thành công] THEN [Thông báo phương án] ELSE Try(i+1); {Tìm bước đi thứ i+1} [Hủy bước đi];End; End; 3. Xây dựng các khái niệmxuất hiện trong giải thuật: - Ô chữ thuật ngữ của bài toán trên là một ma trận có k dòng và mcột (ta chỉ quan tâm đến số k, k chính là số kí tự củaTừ hàng dọc đã cho trước). - Phương án là một cách sắp xếp vị trí của k Từ trên k hàngngang.- Tìm bước đi thứ i cho phương án hiện tại, Try(i), là tìm một Từ chấp nhậnđược trong n Từ cho hàng ngang thứ i của phương án. - Một cách đi là một cách lựa chọn một Từ trong n Từ hàng ngang cho trước. - MộtTừ được gọi là chấp nhận được nếu nó chưa được chọn vàophương án của i-1 bước đi trước, đồng thời Từ đó có ítnhất một kí tự trùng với kí tự thứ i của Từ hàng dọc. - Thực hiện bướcđi là chọn Từ đãđược chấp nhận cho bước đi thứ i. Thành công là tình huống xảy ra khi đã chọn được bước đi thứ k (i=k)cho phương án. Tức là đã chọn được k Từ hàng ngang cho ô chữ. - Thông báo phươngán , hiển thị lên mànhình k số. Số thứ i của phương án cho biết Từ được chọncho hàng ngang i. 4. Xây dựng cấu trúc dữ liệu: Mảng T[1 n] là cáctừ hàng ngang. Xâu ST là từ hàngdọc có k kí tự (k = length(ST)). Mảng D, có ít nhấtk phần tử, dùng để lưu một phương án đang tìm. D[i] cho biếttừ tại hàng ngang i. Mảng B[1 n] mà mỗiphần tử là kiểu lôgic, B[j] cho biết từ T[j] đã được chọn vào phươngán đang tìm hay chưa.5. Giải thuật cụ thể trên cấu trúc dữ liệu đã nêu: {Thủ tục tìm các phươngán} Procedure Try(i); Begin FOR j:=1 TO n DO {mỗi phương án} IF (Not B[j]) and (Pos(ST[i],T[j])>0) THENBegin {thực hiện bước đi} D[i]:=j; B[j]:=True; IF (i=k) THEN Thong_bao_phuong_an ELSE Try(i+1); {thực hiện bước đi thứ i+1} B[j]:=False; {hủy bước đi} End; End; {Thủ tục hiển thị phương án tìm được} Procedure Thong_bao_phuong_an; Begin Writeln(’Phuong an tim duoc:’); FOR i:=1 TO k DO Writeln(D[i]); End; Khi đó, trong chương trình chính, thực hiện các công việc sau:- Nhập dữ liệu cho bài toán; {Các từ hàng ngang và từ hàng dọc}- Khởi tạo: B[j] : = False; với mọi j=1 n {chưa có từ nào được chọn vào phương án}- Gọi Try(1);- Kết thúc.Hy vọng rằng, với những gì đã trình bày, các bạn trẻ sẽ có thêm một công cụ để có thể tự tạo ra các chương trình trò chơi ô chữ với nhiều chủ đề khác nhau trong các dịp thi đố vui, giải trí và học hành. Tuy là một bài toán nhỏ, nhưng cũng mong nhận được ý kiến đóng góp của bạn đọc nhằm tìm giải thuật tối ưu hơn cho bài toán. . như sau: Vớibài toán này, ta dùng giải thuật đệ quy quay lui để vét cạn các phươngán. 2. Giải thuật đệ quy quay lui tổng quát: {Tìm bước đi thứ i cho phương. Giải thuật đệ quy quay lui với bài toán sắp xếp ô chữ thuật ngữVõ Công ChươngCácbạn đã từng

Ngày đăng: 07/09/2012, 11:40

Từ khóa liên quan

Tài liệu cùng người dùng

Tài liệu liên quan