Chuyển đổi ngôn ngữ lập trình từ free pascal sang c++

15 2.7K 1
Chuyển đổi ngôn ngữ lập trình từ free pascal sang c++

Đ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

Chuyên đề Chuyển đổi ngôn ngữ lập trình từ Free Pascal sang C++ MÃ: TI04 Chuyên đề nhằm đáp ứng yêu cầu số trường có nhu cầu chuyển đổi ngôn ngữ lập trình dạy học sinh chuyên Tin từ Free Pascal sang ngôn ngữ C++ Nội dung viết dựa theo “Tài liệu chuyên Tin học - Quyển - Chuyên đề 4” tác giả Hồ Sĩ Đàm - Đỗ Đức Đông Lê Minh Hoàng - Nguyễn Thanh Hùng Thuật toán Quay lui (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 Ưu điểm phương pháp quay lui, vét cạn đảm bảo 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 Do vét cạn thường phù hợp với toán có kích thước nhỏ Phương pháp Trong nhiều toán, việc tìm nghiệm quy việc tìm vector hữu hạn (𝑥! , 𝑥! , … , 𝑥! , … ), độ dài vectơ xác định trước không Vectơ cần phải thoả mãn số điều kiện tùy thuộc vào yêu cầu toán Các thành phần x! chọn từ tập hữu hạn A! Tuỳ trường hợp mà toán yêu cầu: tìm nghiệm, tìm tất nghiệm đếm số nghiệm Ví dụ: Bài toán quân hậu Cần đặt quân hậu vào bàn cờ vua 8×8 cho chúng không công nhau, tức hai quân hậu hàng, cột đường chéo Ví dụ: Hình bên cách đặt hậu thoả mãn yêu cầu toán, ô tô màu vị trí đặt hậu Do quân hậu phải nằm hàng khác nhau, ta đánh số quân hậu từ đến 8, quân hậu 𝑖 quân hậu nằm hàng thứ 𝑖  (𝑖 = 1,2, … ,8) Gọi   𝑥!   cột mà quân hậu 𝑖 đứng Như nghiệm toán vectơ (𝑥! , 𝑥! , … , 𝑥! ), ≤ 𝑥! ≤ 8, tức   𝑥! chọn từ tập 𝐴! = {1,2, … ,8} Vectơ (𝑥! , 𝑥! , … , 𝑥! ) nghiệm  𝑥! ≠ 𝑥!  và hai ô 𝑖, 𝑥! , (𝑗, 𝑥! ) không nằm đường chéo Ví dụ: (1,5,6,8,3,7,2,4) nghiệm Tư tưởng phương pháp quay lui vét cạn sau: Ta xây dựng vectơ nghiệm dần bước, vectơ không (  ) Thành phần 𝑥! chọn từ tập 𝑆! = 𝐴! Giả sử chọn thành phần 𝑥! , 𝑥! , … , 𝑥!!! từ điều kiện toán ta xác định tập 𝑆! (các ứng cử viên chọn làm thành phần 𝑥! , 𝑆! tập 𝐴! Chọn phần tử   từ 𝑆! ta mở rộng nghiệm 𝑥! , 𝑥! , … , 𝑥! Lặp lại trình để tiếp tục mở rộng nghiệm Nếu chọn thành phần   𝑥!!! (𝑆!!! rỗng) ta quay lại chọn phần tử khác  𝑆!  cho 𝑥! Nếu không phần tử khác 𝑆!  ta quay lại chọn phần tử khác 𝑆!!!  làm 𝑥!!!     tiếp tục Trong trình mở rộng nghiệm, ta phải kiểm tra nghiệm xây dựng nghiệm toán chưa Nếu cần tìm nghiệm gặp nghiệm ta dừng lại Còn cần tìm tất nghiệm trình dừng lại tất khả lựa chọn thành phần vectơ nghiệm bị vét cạn Lược đồ tổng quát thuật toán quay lui vét cạn biểu diễn thủ tục Backtrack sau: void Backtrack() { S = A 1; k = 1; while (k > 0) { while (Sk != Ø) { ; Sk = Sk - {xk}; if ((x1, x2, ,xk) nghiệm) ; k = k + 1; ; } k = k - 1; // quay lui } } Trên thực tế, thuật toán quay lui vét cạn thường dùng mô hình đệ quy sau: void Backtrack(i) //xây dựng thành phần thứ i { ; for (xi ∈ Si) { ; if ((x1, x2, ,xi) nghiệm) ; else Backtrack(i+1); ; } } Khi áp dụng lược đồ tổng quát thuật toán quay lui cho toán cụ thể, có ba vấn đề quan trọng cần làm: - Tìm cách biểu diễn nghiệm toán dạng dãy đối tượng chọn dần bước (𝑥! , 𝑥! , … , 𝑥! , … ) - Xác định tập 𝑆!  các ứng cử viên chọn làm thành phần thứ 𝑖 nghiệm Chọn cách thích hợp để biểu diễn  𝑆!   - Tìm điều kiện để vectơ chọn nghiệm toán Một số ví dụ áp dụng 2.1 Tổ hợp Một tổ hợp chập 𝑘 𝑛 tập 𝑘 phần tử tập 𝑛 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 {2,1}, đó, ta coi chúng tổ hợp Bài toán: Hãy xác định tất tổ hợp chập 𝑘 tập 𝑛 phần tử Để đơn giản ta xét toán tìm tổ hợp tập số nguyên từ đến 𝑛 Đối với tập hữu hạn bất kì, cách đánh số thứ tự phần tử, ta đưa toán tập số nguyên từ đến 𝑛 Nghiệm toán tìm tổ hợp chập 𝑘 𝑛 phần tử phải thoả mãn điều kiện sau: - 𝑋  có 𝑘 thành phần: 𝑋 = (𝑥! , 𝑥! , … , 𝑥! );     - 𝑥!  lấy giá trị tập {1,2, … , 𝑛};     - Ràng  buộc:    𝑥! ≤ 𝑥!  với giá trị 𝑖 từ  đến 𝑘 −  (vì tập hợp không phân biệt thứ tự phần tử nên ta xếp phần tử theo thứ tự tăng dần) Ta có: ≤ 𝑥! < 𝑥! < ⋯ < 𝑥! ≤ 𝑛, tập 𝑆!    (tập ứng cử viên chọn làm thành phần thứ 𝑖 ) từ  𝑥! +    đến 𝑛 − 𝑘 + Để điều cho trường hợp 𝑖 = ta thêm vào 𝑥! =   Sau chương trình hoàn chỉnh, chương trình sử dụng mô hình đệ quy để sinh tất tổ hợp chập 𝑘 𝑛   #include #include #define fi "TOHOP.INP" #define fo "TOHOP.OUT" using namespace std; const int NMAX = 21; typedef int Vector[NMAX]; Vector x; int n, k, dem; void Nhap() { cin>>n>>k; } void GhiNghiem(Vector x) { dem++; cout[...]...  liệu  vào   S='ABA'   Kết  quả  ra   Có  3  hoán  vị  khác  nhau  của  'ABA'   1  AAB   2  ABA   14 3  BAA   10 Bài toán mã đi tuần Cho bàn cờ 𝑛×𝑛  ô, tìm cách di chuyển một quân mã (mã di chuyển theo luật cờ vua) trên bàn cờ xuất phát từ ô (1,1) đi qua tất cả các ô, mỗi ô qua đúng một lần Ví dụ: 𝑁 = 5 15 ... dài 𝑛, trong đó thành phần thứ 𝑖 bằng 1 nếu tờ tiền thứ 𝑖 được sử dụng để trả, bằng 0  trong trường hợp ngược lại 𝑋 = (𝑥! , 𝑥! , … , 𝑥! ) là nghiệm nếu: 𝑥! ×𝑡! + 𝑥! ×𝑡! + ⋯ + 𝑥! ×𝑡! = 𝑆 Trong  chương trình  dưới  đây  có  sử  dụng  một  biến  𝑜𝑘  để  kiểm  soát  việc  tìm  nghiệm  Ban  đầu   chưa   có   nghiệm,   do   đó   khởi   trị   𝑜𝑘 = 𝐹𝐴𝐿𝑆𝐸   Khi   tìm   được   nghiệm,   𝑜𝑘   sẽ   được   nhận...  số  a:   1,  4,  6,  9,  10   Kết  quả  ra   nhóm  1:  4,  6   nhóm  2:  1,  9   nhóm  3:  10   6 Một xâu 𝑋 = 𝑥! 𝑥! … 𝑥! được gọi là xâu con của xâu 𝑌   =   𝑦! 𝑦! 𝑦! nếu ta có thể nhận được xâu 𝑋 từ xâu 𝑌 bằng cách xoá đi một số kí tự, tức là tồn tại một dãy các chỉ số: 1 ≤ 𝑖! < 𝑖! < ⋯ < 𝑖! ≤ 𝑁 để 𝑥! = 𝑦!! , 𝑥! = 𝑦!! , … , 𝑥! = 𝑦!! Ví dụ: 𝑋 = ′𝑎𝑑𝑧′ là xâu con của xâu 𝑌 = ′𝑏𝑎𝑐𝑧𝑑𝑡𝑧′; 𝑖! = 2 < 𝑖!...  7  5     10  2  7  3  6  8  5  1  4 2.5 Bài toán máy rút tiền tự động ATM Một máy ATM hiện có 𝑛  (𝑛 ≤ 20)  tờ tiền có giá 𝑡! , 𝑡! , … , 𝑡! Hãy đưa ra một cách trả với số tiền đúng bằng 𝑆 Dữ liệu vào từ file ATM.INP có dạng: - Dòng đầu là 2 số 𝑛  và 𝑆 - Dòng  thứ  2  gồm  𝑛  số 𝑡! , 𝑡! , … , 𝑡! Kết  quả  ra  file  ATM.OUT  có  dạng:  Nếu  có  thể  trả  đúng  𝑆  thì đưa ra cách trả, nếu không ghi -1

Ngày đăng: 06/06/2016, 10:09

Từ khóa liên quan

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

Tài liệu liên quan