Tai lieu boi duong doi tuyen quoc gia 2013 3

43 4 0
Tai lieu boi duong doi tuyen quoc gia 2013 3

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

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

Page of 84 MỤC LỤC Phương pháp duyệt Chuyên đề Duyệt vét cạn Chuyên đề Duyệt nhánh cạnh 12 Chuyên đề Duyệt ưu tiên 24 Tìm kiếm nhị phân Chuyên đề Tìm kiếm nhị phân ứng dụng 27 Xử lý bít Chuyên đề Xử lý bit 30 Quy hoạch động Chuyên đề Quy hoạch động 36 Chuyên đề Quy hoạch động trạng thái 49 Đồ thị Chuyên đề Tìm kiếm theo chiều rộng 58 Chuyên đề Tìm kiếm theo chiều sâu 69 Võ Văn Trị - CQB | Confidential PHƯƠNG PHÁP DUYỆT Chuyên đề Duyệt vét cạn - Backtracking Quay lui, vét cạn, thử sai, duyệt… số tên gọi không đồng nghĩa phương pháp tin học: tìm nghiệm toán cách xem xét tất phương án Đối với người phương pháp thường khơng khả thi số phương án cần kiểm tra lớn Tuy nhiên máy tính, nhờ tốc độ xử lý nhanh, máy tính giải nhiều toán phương pháp quay lui vét cạn Người đề chiến lược nhà toán học người Mỹ Derrick Henry Lehmer (1905 – 1991) vào năm 1950 Ưu điểm phương pháp quay lui, vét cạn ln bảo đảm tìm nghiệm đúng, xác Tuy nhiên, hạn chế phương pháp thời gian thực thi lâu, độ phức tạp lớn Về chất, tư tưởng phương pháp thử khả tìm thấy lời giải Đó q trình tìm kiếm theo độ sâu tập lời giải Trong trình tìm kiếm, gặp hướng lựa chọn không thỏa mãn, ta quay lui, điểm lựa chọn có hướng khác thử hướng lựa chọn Khi thử hết tất hướng lựa chọn xuất phát từ điểm, ta quay lại điểm lựa chọn kế trước Quá trình tìm kiếm kết thúc khơng cịn hư ớng lựa chọn để thử Chiến lược quay lui tương tự với tìm kiếm theo độ sâu tốn khơng gian nhớ hơn, thời gian tìm kiếm lại nhanh Mơ hình thuật toán Backtracking: procedure try(i:integer); begin for begin ; if then else begin ; ; {th bước tiếp theo} ; end; end; end; Bài tập 1: Liệt kê tất dãy nhị phân có độ dài n Võ Văn Trị - CQB | Confidential Page of 84 Phân tích: Dãy nhị phân có độ dài n có dạng (x1, x2, …, xn) với xi ∈ {0, 1}, ≤ ≤ Như vậy, bước thứ i, ta tìm cách chọn giá trị cho biến x i {Chuong trinh cai dat thuat toan de quy} {Liet ke tat ca cac cau hinh nhi phan co dai n} Program BackTracking_ListsOfBinaryPermutations; Const n=3; var i,k:byte; h:array[1 20] of byte; Procedure Try(i:byte); var j:byte; begin for j:=0 to begin h[i]:=j; if i=n then begin for k:=1 to n write(h[k]); writeln; end else Try(i+1); end; end; begin try(1); end Bài tập 2: Liệt kê tất hoán vị tập {1, 2, …, n} Phân tích: Các hốn vị tập {1, 2, …, n} có dạng (x1, x2, …, xn) với xi ∈ {1, 2, … , }, ≤ ≤ xi # xj với i, j - Như vậy, việc xây dựng hoán vị thực qua n bước - Bước thứ i ta chọn số tập {1, 2, …, n} để đặt vào vị trí thứ i hốn vị - Tuy nhiên, ta chọn số x i chưa chọn cho vị trí KT trước Ta sử dụng mảng đánh dấu sau: False True True … Với ý nghĩa: - KT[i] = True i chưa chọn … … Võ Văn Trị - CQB | Confidential … n - KT[i] = False i chọn {Chuong trinh cai dat thuat toan de quy} {Liet ke tat ca cac hoan vi cua tap (1,2, ,n)} Program BackTracking_PermutationLists; Uses crt; Const n=3; var i,k:byte; kt:array[1 20] of boolean; h:array[1 20] of byte; Procedure Try(i:byte); var j:byte; begin for j:=1 to n if kt[j] then begin h[i]:=j; kt[j]:=false; if i=n then begin for k:=1 to n write(h[k],' '); writeln; end else Try(i+1); kt[j]:=true; end; end; begin clrscr; fillchar(kt[1],n,true); try(1); end Bài tập 3: Tổ hợp Một tổ hợp chập k n tập k phần tử n phần tử Chẳng hạn tập {1, 2, 3, 4} có tổ hợp chập là: {1, 2}, {1, 3}, {1, 4}, {2, 3}, {2, 4}, {3, 4} Vì tập hợp phần tử khơng phân biệt thứ tự nên tập {1, 2} tập hợp {2, 1}, ta coi chúng tổ hợp Yêu cầu: Hãy xác định tất tổ hợp chập k tập n phần tử  Phân tích: Võ Văn Trị - CQB | Confidential Page of 84 Mỗi tổ hợp chập k n phần tử có dạng (x 1, x2, …, xk) đó: xi giá trị nằm tập {1, 2, …, n} tập hợp khơng phân biệt thứ tự nên ta xếp phần tử theo thứ tự tăng dần, ràng buộc x i < xi+1 với giá trị i từ đến k -1 - ứng cử viên xi chọn từ tập giá trị {x i-1 + 1, , n – (k-i)} - nguyên tắc chọn giúp ta khỏi cần phải dánh dấu, việc chọn giá trị phần tử chọn trước nên khơng bị lặp lại  Chương trình - {chuong trinh de quy quay lui} {liet ke tat ca cac to hop chap k cua tap n phan tu} program BackTracking_PermutationLists; const n=4; k=3; var h:array[1 20] of byte; i:byte; procedure ghinghiem; var j:byte; begin write('{'); for j:=1 to k write(h[j],' '); writeln('}'); end; procedure try(i:byte); var j:byte; begin for j:= h[i-1]+1 to n-(k-i) begin h[i]:=j; if i=k then ghinghiem else try(i+1); end; end; begin try(1); readln; end Bài tập 4: Chỉnh hợp lặp Chỉnh hợp lặp chập k n phần tử dãy gồm k thành phần, thành phần phần tử tập n phần tử, không yêu cầu thành phần khác có phân biệt thứ tự cấu hình Ví dụ, dãy nhị phân có độ dài chỉnh hợp lặp chập tập phần tử {0, 1} Các dãy nhị phân có độ dài 3: 000, 001, 010, 011, 100, 101, 111 Võ Văn Trị - CQB | Confidential Vì có phân biệt thứ tự nên cấu hình 001 khác với 010 Như vậy, cách tìm nghiệm tốn chỉnh hợp lặp sau: - Mỗi chỉnh hợp lặp chập k tập n phần tử có dạng (x 1, x2, …, xk) xi giá trị lấy tập {1, 2, …, n} khơng có ràng buộc thành phần {chuong trinh de quy quay lui} {liet ke tat ca cac chinh hop lap chap k cua n} program Backtracking_chinhhoplap; const n=2; k=3; var h:array[1 20] of byte; i:byte; procedure ghinghiem; var j:byte; begin for j:=1 to k write(h[j],' '); writeln end; procedure chinhhoplap(i:byte); var j:byte; begin for j:=1 to n begin h[i]:=j; if i=k then ghinghiem else chinhhoplap(i+1); end; end; begin chinhhoplap(1); readln end Bài tập 5: Chỉnh hợp không lặp Đối với chỉnh hợp lặp, thành phần phép lặp lại Đối với chỉnh hợp không lặp chập k n phần tử, thành phần không phép lặp lại Ví dụ, có n người, cách chọn k người để xếp thành hàng chỉnh hợp không lặp chập k n phần tử Một trường hợp đặc biệt chỉnh hợp k hông lặp hoán vị Hoán vị tập n phần tử chỉnh hợp không lặp chập n n Như vậy, cách tìm nghiệm tốn sau: - Mỗi nghiệm toán dãy gồm k thành phần (x 1, x2, …, xk) Võ Văn Trị - CQB | Confidential Page of 84 - Mỗi thành phần x i giá trị lấy tập {1, 2, …, n} - Các giá trị đơi khác nhau, để kiểm sốt ràng buộc này, ta sử dụng mảng đánh dấu ok với ý nghĩa sau:  Ok[j] = true có nghĩa j chọn  Ok[j] = false khơng chọn được, chọn j cho vị trí trước * Chương trình s au: {Chuong trinh de quy quay lui liet ke tat ca cac chinh hop ko lap} program Backtracking_chinhhopkolap; const n=2; k=2; var ok:array[1 20] of boolean; h:array[1 20] of byte; i:byte; procedure ghinghiem; var j:byte; begin for j:=1 to k write(h[j],' '); writeln; end; procedure Chinhhopkolap(i:byte); var j:byte; begin for j:=1 to n if ok[j] then begin h[i]:=j; ok[j]:=false; if i=k then ghinghiem else chinhhopkolap(i+1); ok[j]:=true; end; end; begin fillchar(ok[1],n,true); chinhhopkolap(1); readln; end Bài tập 6: Bài toán xếp tám quân hậu Một bàn cờ quốc tế bảng hình vuông gồm hàng, cột Quân hậu quân cờ ăn quân hàng, cột hay đường chéo Hãy xếp tám quân hậu bàn cờ cho khơng có qn hậu ăn quân hậu Giải : Võ Văn Trị - CQB | Confidential - Theo toán, cột (j=1 8) bàn cờ đặt quân hậu Như với cột ta phải tìm dịng thứ i để đặt quân hậu vào Có phương án chọn dòng i: i=1, 2, …, Ta đặt qn hậu vào [i,j] khi: - - - Đường chéo song song với đường chéo qua [i,j] chưa có hậu Đường chéo song song với đường chéo phụ qua ô [i,j] chưa có hậu Khi đó, thủ tục try(j) thực nhiệm vụ chọn dòng thứ i để đặt quân hậu thứ j vào [i,j] Ta minh họa bàn cờ sau: Nhìn vào bàn cờ, ta thấy: - - Dịng i chưa có hậu Các ô nằm đường chéo // với đường chéo hiệu số dịng số cột không đổi; Các ô nằm đường chéo // với đường chéo phụ tổng số cột số dịng khơng đổi; Vì thế, ta đánh dấu trạng thái bàn cờ sau: - Đánh dấu trạng thái dòng - Đánh dấu trạng thái đường chéo // với đường chéo Võ Văn Trị - CQB | Confidential Page of 84 - - Đánh dấu trạng thái đường chéo // với đường chéo phụ Để lưu giữ kết quả, ta sử dụng mảng chiều x {Chuong trinh de quy quay lui liet ke moi nghiem cua bai toan quan hau} program eightQueen; const fo='equeen.out'; var {danh dau trang thai dong} a:array[1 8] of boolean; {danh dau trang thai duong cheo // cheo chinh} b:array[-7 7] of boolean; {danh dau trang thai duong cheo // cheo phu} c:array[2 16] of boolean; x:array[1 8] of byte; j:byte; f:text; procedure ghinghiem; var i:byte; begin for i:=1 to write(f,x[i], ' '); writeln(f); end; procedure equeen(j:byte); var i:byte; begin for i:=1 to if a[i] and b[i-j] and c[i+j] then Võ Văn Trị - CQB | Confidential begin x[j]:=i; a[i]:=false; b[i-j]:=false; c[i+j]:=false; if j=8 then ghinghiem else equeen(j+1); a[i]:=true; b[i-j]:=true; c[i+j]:=true; end; end; begin fillchar(a[1],8,true); fillchar(b[-7],15,true); fillchar(c[2],15,true); assign(f,fo); rewrite(f); equeen(1); close(f); end Bài tập 7: Bài toán máy rút tiền tự động ATM Một máy ATM có n ( ≤ 20) tờ tiền có giá t 1, t2, …, tn Hãy đưa cách trả với số tiền s Input: tệp ATM.INP có dạng: - Dịng 1: ghi hai số n S; Dòng 2: ghi n số t1, t2, …, tn Output: ghi tệp ATM.OUT có dạng: Nếu trả S đưa cách trả, khơng ghi -1 ATM.INP 10 390 200 10 20 50 100 100 20 20 50 50 20 ATM.OUT 50 50 100 100 50 Nghiệm toán dãy nhị phân độ dài n, thành phần thứ i tờ tiền thứ i sử dụng, trường hợp ngược lại (x 1, x2, …, xn) nghiệm 1 + 2 + ⋯ + * Chương trình: {Chuong trinh de quy quay lui giai bai toan may rut tien tu dong ATM} Program AtmSolution; const fi='atm.inp'; Võ Văn Trị - CQB | Confidential Page 28 of 84 Các bạn đọc truyện tranh Nhật Bản Yugi-oh hẳn u thích trị chơi Magic Bộ chiến thuật chơi định đến thắng thua đối thủ(mà thắng thua cịn liên quan đến tính mạng >_

Ngày đăng: 09/09/2021, 11:09

Từ khóa liên quan

Mục lục

  • MucLuc

  • DuyetNhanhCan

  • DuyetUuTien

  • TimKiemNhiPhan

  • XuLiBit

  • QuyHoachDong

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

  • Đang cập nhật ...

Tài liệu liên quan