I. Lí do chọn đề tài Qua thực tiễn giảng dạy bộ môn tin học ở THPT, đặc biệt quá trình bồi dưỡng học sinh dự thi chọn HSG tỉnh gặp một số khó khăn nhất định một trong số đó là tài liệu chọn lọc phục vụ cho việc ôn thi còn hạn chế. Từ thực tế tôi nhận thấy để đạt kết quả cao học sinh phải nhận dạng được bài toán và áp dụng các thuật toán phù hợp. Trong các đề thi thường có 1 câu về tìm đường đi tối ưu trên lưới ô vuông. Để giải quyết được bài toán này không chỉ đòi hỏi học sinh có kiến thức về mảng 2 chiều mà còn phải nắm vững thuật toán loang, quy hoạch động, kỷ năng, tư duy và tính sáng tạo trong lập trình. Kiến thức về loang, quy hoạch động trên lưới ô vuông không chỉ giúp học sinh khá giỏi có thêm một công cụ không thể thiếu khi làm bài thi mà còn giúp các em nắm được nhiều kiến thức khoa học thực tiễn, liên quan đến nhiều vấn đề thường gặp trong cuộc sống như việc thiết kế, tìm kiếm đường đi tối ưu… Đối với một số giáo viên mới ra trường, kinh nghiệm bồi dưỡng học sinh giỏi còn hạn chế thì đây là một trong những nguồn tài liệu bổ ích, rút ngắn được quá trình tìm kiếm, nghiên cứu mà vẫn đạt được nhiều kiến thức chuyên môn. Vì vậy tôi chọn đề tài “Đường đi tối ưu trên lưới ô vuông” với mong muốn giúp học sinh, một số giáo viên có thêm tài liệu để có thể hiểu sâu và áp dụng giải dạng bài toán này. II. Đối tượng nghiên cứu Cách lưu trữ lưới ô vuông trên máy tính Lý thuyết về thuật toán loang, thuật toán Quy hoạch động và áp dụng để giải các bài toán tìm đường đi tối ưu trên lưới ô vuông.
Trang 1IV Mục đích nghiên cứu 2
V Nhiệm vụ nghiên cứu 2
VI Giả thiết khoa học 3 VII Phương pháp nghiên cứu 3 VIII Dự kiến đóng góp của đề tài 3
B NỘI DUNG 4
I Cơ sở lý luận và thực tiễn của đề tài 4
1 Cơ sở lý luận 4
2 Cơ sở thực tiễn 4
II THUẬT TOÁN LOANG VÀ ỨNG DỤNG TÌM ĐƯỜNG ĐI TỐI ƯU TRÊN LƯỚI Ô VUÔNG 5
1 Thuật toán Loang 5
2 Áp dụng thuật toán loang tìm đường đi ngắn nhất trên lưới ô vuông 7 III THUẬT TOÁN QUY HOẠCH ĐỘNG VÀ ỨNG DỤNG TÌM ĐƯỜNG ĐI TỐI ƯU TRÊN LƯỚI Ô VUÔNG 44
1 Thuật toán Quy hoạch động 44
2 Áp dụng thuật toán quy hoạch động giải một số bài tập tìm đường đi tối ưu trên lưới ô vuông 44
IV BÀI TẬP TỰ LUYỆN 71
V Đánh giá bài viết 76
VI Quá trình thực nghiệm sư phạm 76
C PHẦN KẾT LUẬN 77
1 Ý nghĩa của đề tài 77
2 Kiến nghị 77
Trang 2A PHẦN MỞ ĐẦU
I Lí do chọn đề tài
Qua thực tiễn giảng dạy bộ môn tin học ở THPT, đặc biệt quá trình bồi dưỡng họcsinh dự thi chọn HSG tỉnh gặp một số khó khăn nhất định một trong số đó là tài liệu chọnlọc phục vụ cho việc ôn thi còn hạn chế Từ thực tế tôi nhận thấy để đạt kết quả cao họcsinh phải nhận dạng được bài toán và áp dụng các thuật toán phù hợp Trong các đề thithường có 1 câu về tìm đường đi tối ưu trên lưới ô vuông Để giải quyết được bài toánnày không chỉ đòi hỏi học sinh có kiến thức về mảng 2 chiều mà còn phải nắm vữngthuật toán loang, quy hoạch động, kỷ năng, tư duy và tính sáng tạo trong lập trình
Kiến thức về loang, quy hoạch động trên lưới ô vuông không chỉ giúp học sinh khágiỏi có thêm một công cụ không thể thiếu khi làm bài thi mà còn giúp các em nắm đượcnhiều kiến thức khoa học thực tiễn, liên quan đến nhiều vấn đề thường gặp trong cuộcsống như việc thiết kế, tìm kiếm đường đi tối ưu…
Đối với một số giáo viên mới ra trường, kinh nghiệm bồi dưỡng học sinh giỏi cònhạn chế thì đây là một trong những nguồn tài liệu bổ ích, rút ngắn được quá trình tìmkiếm, nghiên cứu mà vẫn đạt được nhiều kiến thức chuyên môn
Vì vậy tôi chọn đề tài “Đường đi tối ưu trên lưới ô vuông” với mong muốn giúp
học sinh, một số giáo viên có thêm tài liệu để có thể hiểu sâu và áp dụng giải dạng bàitoán này
II Đối tượng nghiên cứu
- Cách lưu trữ lưới ô vuông trên máy tính
- Lý thuyết về thuật toán loang, thuật toán Quy hoạch động và áp dụng để giải cácbài toán tìm đường đi tối ưu trên lưới ô vuông
III Phạm vi nghiên cứu
- Tìm hiểu về thuật toán loang và cách áp dụng giải bài toán tìm đường đi ngắn nhấttrên lưới ô vuông
- Tìm hiểu về thuật toán quy hoạch động và cách áp dụng giải bài toán tìm đường đitối ưu trên lưới ô vuông
IV Mục đích nghiên cứu
Giúp học sinh nhận dạng và áp dụng giải quyết một số bài toán tìm đường đi tối ưutrên lưới ô vuông bằng thuật toán loang và quy hoạch động
V Nhiệm vụ nghiên cứu
- Tìm hiểu các kiến thức về mảng 2 chiều, thuật toán loang, quy hoạch động
Trang 3- Đưa ra được các dạng bài tập về đường đi tối ưu trên lưới ô vuông và cách giảiquyết.
VI Giả thiết khoa học
Từ kiến thức Sách giáo khoa và vận dụng thêm phần kiến thức về Loang, Quyhoạch động qua đây giáo viên rèn luyện tư duy và kỹ năng giải các bài toán và kỹ nănglập trình cho học sinh
VII Phương pháp nghiên cứu
- Phương pháp nghiên cứu lý thuyết: nghiên cứu sách, báo và các tài liệu điện tử,website về lập trình
- Phương pháp phỏng vấn chuyên gia: tiếp thu ý kiến cố vấn, đánh giá của các giáoviên có kinh nghiệm
- Tham khảo ý kiến của đồng nghiệp
- Phương pháp thực nghiệm: Áp dụng vào giảng dạy, bồi dưỡng học sinh giỏi Tinhọc khối 11,12
VIII Dự kiến đóng góp của đề tài
- Về lý luận: Đã hệ thống được kiến thức, dạng bài tập về tìm đường đi tối ưu trênlưới ô vuông Các loại bài tập có tính phân hóa cao, chú trọng phát triển cả tư duy lậptrình
- Về thực tiễn: Sử dụng đề tài làm tài liệu tham khảo để giảng dạy bộ môn tin học,đặc biệt là quá trình bồi dưỡng, luyện thi học sinh giỏi
Trang 4Dạy học sinh THPT lập trình là một công việc khó khăn và ở đó bộc lộ rõ nhất trình
độ của người giáo viên trong việc hướng dẫn hoạt động trí tuệ của học sinh Trong số đóviệc bồi dưỡng học sinh giỏi vừa có những thuận lợi và khó khăn nhất định Thuận lợi ởchỗ những học sinh trong đội tuyển đa số có năng lực tư duy thuật toán từ mức khá trởlên Tuy vậy để học sinh có thể nắm bắt tốt nội dung kiến thức, giải quyết tốt các bài toánkhi tham gia các kỳ thi thì quan trọng nhất là các em phải nắm vững được thuật toán, biếtlựa chọn thuật toán phù hợp với bài toán và kỷ năng cài đặt chương trình Vì vậy trongquá trình giảng dạy cần phân dạng các bài toán và hướng dẫn học sinh sử dụng các thuậttoán để cài đặt các dạng bài toán đó Trong tin học có rất nhiều dạng bài khác nhau, bàitoán tìm đường đi tối ưu trên lưới ô vuông là một trong những số đó Và việc tìm hiểuphương pháp giải quyết bài toán này là vấn đề quan trọng với cả giáo viên và học sinh đểdạy và học tốt môn Tin học
2 Cơ sở thực tiễn
Bài toán nghiên cứu về đường đi tối ưu trên lưới ô là dạng bài tập hết sức quenthuộc với các em học sinh tham gia các lớp bồi dưỡng luyện thi học sinh giỏi Đặc biệttrong các đề thi học sinh giỏi tỉnh và thi Olympic Tin học, dạng bài này thường xuyênxuất hiện Các bài toán thường gặp nhất đó là: Tìm đường đi ngắn nhất, tìm đường đi tối
ưu với chi phí thấp nhất, cao nhất…
Tuy nhiên, trong chương trình sách giáo khoa Tin học 11 không có nội dung này đểhọc sinh được tiếp cận Với lí do đó, trong đề tài này của mình tôi đã trình bày cách nhậndạng, sử dụng thuật toán loang và quy hoạch động để giải bài toán tìm đường đi tối ưutrên lưới ô vuông một cách có hệ thống nhằm giúp cho học sinh có thể tiếp cận và giảiquyết được bài toán này
Trong đề tài này tôi đưa ra 2 thuật toán cơ bản thường được sử dụng để giải quyếtdạng bài toán này Đó là thuật toán loang và quy hoạch động Đối với mỗi bài toán chúng
ta cần nhận dạng và sử dụng thuật toán phù hợp để chương trình cài đặt có hiệu quả caonhất
Trang 5II THUẬT TOÁN LOANG VÀ ỨNG DỤNG TÌM ĐƯỜNG ĐI TỐI ƯU TRÊN LƯỚI Ô VUÔNG
1 Thuật toán Loang
Thuật toán Loang thực chất là thuật toán tìm kiếm theo chiều rộng trên đồ thị
(Breadth First Search) Tư tưởng của thuật toán tím kiếm theo chiều rộng là “lập lịch”duyệt các đỉnh Việc thăm một đỉnh sẻ lên lịch duyệt các đỉnh nối từ nó sao cho thứ tựduyệt là ưu tiên theo chiều rộng (đỉnh nào gần đinh xuất phát s hơn sẻ được duyệt trước).Đầu tiên ta thăm đỉnh s Việc thăm đỉnh s sẻ phát sinh thứ tự thăm các đỉnh u1, u2, …nối
từ s (những đỉnh gần s nhất) Tiếp theo ta thăm đỉnh u1, khi thăm đỉnh u1 sẻ lại phát sinhyêu cầu thăm những đỉnh v1, v2, nối từ u1 Nhưng rõ ràng những đỉnh v này xa đỉnh s hơnđỉnh u nên chúng chỉ được thăm khi tất cả các đỉnh u đã được thăm Tức là thứ tự duyệtđỉnh sẻ là s, u1, u2, …,v1, v2,…Thuật toán tìm kiếm theo chiều rộng sử dụng một danhsách để chứa những đỉnh đang “chờ” thăm Tại mỗi bước ta thăm các đỉnh gần đầu danhsách, loại nó ra khỏi danh sách và cho những đỉnh chưa “xếp hàng” kề với nó xếp hàngthêm vào cuối danh sách Thuật toán sẻ kết thúc khi danh sách rỗng
Vì nguyên tắc vào trước ra trước, danh sách chứa những đỉnh đang chờ thăm được
tổ chức dưới dạng hàng đợi (Queue)
QUEUE = ; {Khởi tạo QUEUE ban đầu là rỗng}
QUEUE <= s; {Nạp đỉnh s vào QUEUE}
Chuaxet[s]:=False;{Đỉnh s nạp vào QUEUE là đã xét rồi => cờ của s là False} While QUEUE ≠ do
Begin
p <= QUEUE; {Lấy p từ QUEUE}
Thăm đỉnh p;
For u € Ke(p) do {Những đỉnh u chung cạnh với đỉnh p}
If Chuaxet(u) then {Nếu đỉnh u chưa xét đến}
Begin
QUEUE <= u; {Nạp u vào QUEUE}
Chuaxet[u]:=False; {Đỉnh u đã xét rồi =>cờ của u là False }
Trang 6Với bài toán trên ta sử dụng mảng 1 chiều Q: Array[1 N] of Byte để biểu diễnQUEUE Khi đó thao tác nạp vào và lấy ra được thực hiện như sau:
FillChar(Q,SizeOf(Q),0); {Khởi tạo tất cả các phần tử của Q có giá trị 0}
Dau:=1;
Cuoi:=1;
Q[cuoi]:=s; {Ban đầu nạp đỉnh s vào Q}
Để nạp thêm đỉnh u nào đó vào Q ta thực hiện:
Trang 7Ta có cách khai báo như sau:
var
qx:array[1 1000000] of longint;{Queue chỉ số hàng} qy:array[1 1000000] of longint; {Queue chỉ số cột}
2 Áp dụng thuật toán loang tìm đường đi ngắn nhất trên lưới ô vuông
Dạng 1: Bài toán tìm đường đi đơn giản
Đây là một số bài tập áp dụng thuật toán loang để tìm đường đi ngắn nhất Tuynhiên yêu cầu của đề bài chưa phức tạp nên chỉ cần nắm vững kỷ thuật cài đặt thuật toánloang sẻ giải quyết được
Bài 1 Gặm cỏ
Một đồng cỏ hình chữ nhật thành các ô vuông nhỏ với R (1 <= R <= 100) hàng và C(1 <= C <= 100) cột Trên mỗi ô được đánh dấu với ký hiệu ‘*’ là đá và ‘.’ là cỏ Một chú
bò đứng ở vị trí có toạ độ R_b,C_b và muốn ăn cỏ theo cách của mình, từng ô vuông một
và trở về chuồng ở ô 1,1 ; bên cạnh đó đường đi này phải là ngắn nhất
Chú bò có thể đi từ 1 ô vuông sang 4 ô vuông khác kề cạnh
Dưới đây là một bản đồ ví dụ [với đá ('*'), cỏ ('.'), chuồng bò ('B'), và chú bò ('C') ởhàng 5, cột 6 và một bản đồ cho biết hành trình tối ưu của chú bò, đường đi được dánhdấu bằng chữ ‘m’
Bản đồ Đường đi tối ưu
Dòng 1: 2 số nguyên cách nhau bởi dấu cách: R và C
Dòng 2 R+1: Dòng i+1 mô tả dòng i với C ký tự
Trang 8Ý tưởng:
Thực hiện loang tại vị trí của bò để tìm đường đi ngắn nhất về tại vị trí chuồng.Dùng mảng a đánh dấu các ô đã đi, thực hiện loang theo 4 hướng, nếu tại lần duyệt nào
đó gặp ô (1,1) thì lập tức thông báo kết quả và dừng chương trình Để đếm được số bước
đi, ta sẽ dùng 1 biến đếm và thêm 1 biến hỗ trợ trong khi duyệt hàng đợi có tác dụngnhận biết các ô có cùng số bước đi
Trang 9Dạng 2: Bài toán tìm đường đi tối ưu có điều kiện.
Tùy thuộc vào yêu cầu của bài toán mà trong quá trình thực hiện loang chúng taphải linh hoạt sử dụng các kỷ thuật cài đặt để đáp ứng
Bài 1 ĐƯỜNG ĐI
Cho lưới ô vuông gồm n dòng, n cột chứa các giá trị 0 hoặc 1 Từ một ô có giá trị 0
được phép đi sang một ô có giá trị 0 và có chung cạnh với ô đó Không được đi vào bất
cứ ô nào có giá trị 1 Độ dài đường đi được xác định bởi số các ô vuông thuộc đường đi
đó Đường đi ngắn nhất là đường đi có độ dài nhỏ nhất
Trang 10Một người xuất phát từ một ô có giá trị 0 trong lưới Hãy tìm đường đi ngắn nhất đểngười đó đi ra ngoài, tức là đi đến một ô có giá trị 0 nằm ở biên của lưới (ô có ít nhất mộtcạnh nằm ở biên của lưới)
Input: Cho trong tệp văn bản DUONGDI.INP gồm:
Dòng đầu chứa số nguyên dương n cho biết lưới có n hàng, n cột (n<=1000)
Dòng thứ 2 chứa 2 số x0 và y0 là số dòng và số cột của ô xuất phát (1<x0,y0<n)
N dòng tiếp theo mỗi dòng ghi n số 0 hoặc 1 lần lượt là giá trị các ô của lưới
Các số trên cùng dòng cách nhau ít nhất 1 khoảng trắng
Output : xuất ra tập tin văn bản DUONGDI.OUT gồm một dòng ghi đường đi ngắn
nhất Trường hợp không có đường đi ra ngoài thì ghi số -1
Ý tưởng: Sử dụng thuật toán loang từ vị trí xuất phát ra biên của lưới
- Hướng loang: Bài toán cho biết từ một ô giá trị 0 được loang sang các ô chungcạnh nên ta sẻ thực hiện loang theo 4 hướng Từ ô (i,j) có thể loang sang 1 trong 4 ô (i-1,j); (i,j-1); (i+1,j) hoặc (i,j+1) với điều kiện ô được loang đến có giá trị 0
- Kết thúc loang: Bắt gặp 1 ô (x,y) có giá trị 0 nằm ở biên của lưới Thuộc 1 trong 4trường hợp sau: x=1; x=m; y=1; y=n
Trang 12if (chon[xi,yi]) and (a[xi,yi]=0) then
Bài 2 Quân tượng
Xét bàn cờ vuông kích thước n×n Các dòng được đánh số từ 1 đến n, từ dưới lêntrên Các cột được đánh số từ 1 đến n từ trái qua phải
Ô nằm trên giao của dòng i và cột j được gọi là ô (i,j) Trên bàn cờ có m (0 ≤ m ≤ n)quân cờ Với m > 0, quân cờ thứ i ở ô (ri, ci), i = 1,2, , m Không có hai quân cờ nào ởtrên cùng một ô Trong số các ô còn lại của bàn cờ, tại ô (p, q) có một quân tượng Mỗimột nước đi, từ vị trí đang đứng quân tượng chỉ có thể di chuyển đến được những ô trêncùng đường chéo với nó mà trên đường đi không phải qua các ô đã có quân
Cần phải đưa quân tượng từ ô xuất phát (p, q) về ô đích (s,t) Giả thiết là ở ô đíchkhông có quân cờ Nếu ngoài quân tượng không có quân nào khác trên bàn cờ thì chỉ có 2trường hợp: hoặc là không thể tới được ô đích, hoặc là tới được sau không quá 2 nước điKhi trên bàn cờ còn có các quân cờ khác, vấn đề sẽ không còn đơn giản như vậy
Yêu cầu: Cho kích thước bàn cờ n, số quân cờ hiện có trên bàn cờ m và vị trí củachúng, ô xuất phát và ô đích của quân tượng Hãy xác định số nước đi ít nhất cần thựchiện để đưa quân tượng về ô đích hoặc đưa ra số -1 nếu điều này không thể thực hiệnđược
- Input: File quantuong.inp
Dòng đầu tiên chứa 6 số nguyên n, m, p, q, s, t
Nếu m > 0 thì mỗi dòng thứ i trong m dòng tiếp theo chứa một cặp số nguyên ri , cixác định vị trí quân thứ i
Hai số liên tiếp trên cùng một dòng được ghi cách nhau ít nhất một dấu cách
- Output: File quantuong.out
Trang 13Gồm 1 dòng duy nhất là số nước đi tìm được hoặc số -1.
nó trong hàng đợi Do bài toán cần tìm ra đường đi ngắn nhất nên trong quá trình duyệtnếu gặp ô cần tới thì thông báo kết quả và dừng chương trình, ngược lại nếu không tìmthấy thì in -1
Trang 16Bài 3 Mê cung
Để cứu được công chúa, các hiệp sĩ phải vượt qua một thử thách Lão phù thủy nhốtcông chúa trong một mê cung có kích thước MxN (1≤ M, N ≤1000) Trong mê cung đầynhững bức tượng đá, vốn là các hiệp sĩ do không vượt qua thử thách nên bị biến thànhtượng đá Tuy nhiên trên dòng M và cột N của mê cung có một vị trí không có tượng đá,giúp “thoát” ra khỏi mê cung
Tuy nhiên lão đoán rằng các hiệp sĩ đã vào đến đây thì thuật toán chắc không tầmthường, nên thay vì cho biết vị trí công chúa và đố tìm đường đi ngắn nhất thoát khỏi mêcung, thì lại đố tìm vị trí công chúa biết rằng nàng ở nơi xa nhất trong những đường ngắnnhất thoát khỏi mê cung, thời gian tìm kiếm trong khoảng 1 giây
Yêu cầu: Cho ma trân MxN, mỗi ô chứa giá trị nhị phân, 0 là rỗng và 1 là có tượng
đá Tìm độ dài đường đi xa nhất trong những đường đi ngắn nhất thoát khỏi mê cung và
số vị trí công chúa có thể đứng Biết rằng, độ dài đường đi là số ô của đường đi, chỉ được
đi qua các ô kề cạnh, không được đi qua ô có tượng đá, mọi ô rỗng đều có đường thoát
Dữ liệu: Vào từ file văn bản mecung.inp: dòng đầu là M và N, các dòng sau chứa
ma trận nhị phân
Kết quả: Đưa ra file văn bản mecung.out: ghi hai số nguyên là độ dài và số vị trí
thỏa yêu cầu
Trang 18Trong luật cờ vua, mỗi nước đi của quân mã được quy định như sau: quân mã đang
ở vị trí X như hình bên dưới có thể đi đến một trong các ô mà mũi tên chỉ đến (theo
đường chéo của hình chữ nhật 2x3)
Yêu cầu: Cho trước bàn cờ kích thước m x n ô Hãy đếm
số nước đi ít nhất để quân mã di chuyển từ ô có tọa độ (x1,
y1) đến ở có tọa độ (x2, y2) Trong trường hợp không đếnđược thì xuất ra giá trị -1
Trang 19Dữ liệu vào: quanma.inp
•Dòng 1 ghi 2 số nguyên dương m,n (2 <= n, m <= 1000)
•Dòng 2 ghi 2 số nguyên x1, y1 (1 <= x1 <= m, 1 <= y1 <= n)
•Dòng 3 ghi 2 số nguyên x2, y2 (1 <= x2 <= m, 1 <= y2 <= n)
Các số ghi trên cùng một dòng cách nhau ít nhất một kí tự trắng
Kết quả: quanma.out
Ghi ra một số nguyên duy nhất cho biết số nước đi ít nhất để quân mã di chuyển từ
ô (x1, y1) đến ô (x2, y2) Nếu không đến được thì ghi số -1
Trang 20a[qx[dau]+x[k],qy[dau]+y[k]]:=false;
if (qx[dau]+x[k]=x2) and (qy[dau]+y[k]=y2) then inketqua; inc(cuoi);
qx[cuoi]:=qx[dau]+x[k]; qy[cuoi]:=qy[dau]+y[k]; end;
Trong một mảnh vườn hình chữ nhật có cạnh m, n người ta trồng cà rốt trong những
ô đơn vị hình vuông có cạnh 1 Trong mảnh vườn này có một chú thỏ ở trong một hangchiếm diện tích 1 ô vuông đơn vị, chú thỏ này cần xác định miền người ta đã trồng cà rốt
có diện tích (Hai miền khác nhau không có một cạnh ô vuông nào chung) lớn nhất trongmảnh vườn để đào một đường hầm ngắn nhất theo phương dọc hoặc phương ngang từhang đến phần diện tích lớn nhất đó
Trang 21Dữ liệu vào từ file văn bản carot.inp:
Dòng đầu tiên ghi 4 số M , N , x, y với x, y là hàng và cột của hang thỏ trong mảnhvườn (1≤M,N≤100)
Trong M dòng tiếp theo, mỗi dòng có N ký tự 0 hoặc 1 thể hiện hàng thứ i của mảnhvườn với ý nghĩa 0 là không trồng cà rốt, 1 là có trồng cà rốt
Giả thiết vị trí của thỏ luôn đến được vùng có nhiều cà rốt nhất
Kết quả: Ghi ra file văn bản carot.out:
Dòng đầu ghi S là chiều dài của đường hầm (S=0 nếu hang thỏ đang ở trên phầntrồng cà rốt có diện tích lớn nhất
Nếu S>0 thì trong các dòng tiếp theo lần lượt ghi hàng và cột của các ô trên đườnghầm bắt đầu từ hang thỏ đến vùng diện tích lớn nhất trồng cà rốt
Trang 24Một mê cung có dạng 1 hình chữ nhật
m*n ô, trong đó có 1 số ô là tường Một con
chuột và 1 miếng bánh nằm ở các ô cho
trước Ở mỗi bước di chuyển, con chuột có
thể di chuyển sang các ô kề cạnh nhưng
không thể rẻ trái và không được đi vào vị
trí các ô là tường
Yêu cầu: Đếm số bước di chuyển ít nhất để
con chuột có thể ăn được bánh
Dữ liệu vào: Tệp chuot.inp chứa dãy số nguyên, bắt đầu là kích thước của mê cung(M,N<=100), tiếp theo là các tọa độ Xr, Yr của chuột và Xf, Yf của bánh Tiếp theo là sốnguyên k cho biết có k bức tường và k cặp tọa độ của chúng
Dữ liệu ra: Tệp chuot.out
- Dòng đầu ghi số bước di chuyển ít nhất
- Dòng tiếp theo ghi tọa độ các bước đã đi của chuột
Chuot.inp Chuot.out Mô tả hướng đi của chuột
4
3
1
4
Trang 25Ví dụ: Trên hình vẽ mũi tên nét liền là
hướng đi trước, nét đứt là hướng không
được đi tiếp
- Trước đó hướng 4 thì tiếp theo tránh
for i:=0 to 2 do begin l:=huongtruoc+i;
Trang 26inc(c);
h[c]:=l;
tr[c]:=d;
qx[c]:=qx[d]+hi[l]; qy[c]:=qy[d]+hj[l];
Trang 27Bài 7 Mario cứu công chúa.
Lão phù thủy có một khu hầm hình chữ nhật gồm n x m căn hầm Các căn hầmđược đánh số từ dòng từ 1 đến n theo chiều từ trên xuống dưới, đánh số cột từ 1 đến mtheo chiều từ trái qua phải Giữa hai căn hầm sát nhau có cửa thông nhau mà phải mấtmột khoảng thời gian nào đó mới có thể mở cửa để đi từ căn hầm này sang căn hầm kia.Sau khi bắt cóc công chúa, lão phù thủy giam nàng tại căn hầm cuối cùng [n,m] - dòng ncột m Robot Mario đang ở căn hầm đầu tiên [1, 1] Bạn hãy tìm các căn hầm mà Mariophải đi qua để giải cứu công chúa một cách nhanh nhất
Trang 281 9 9 9program mario;
Trang 29end;
Trang 30Từ vệ tinh, robot nhận được bản đồ địa hình dưới dạng lưới ô vuông kích thước
m*n ô (0 < m, n ≤ 100), trên mỗi ô ghi một số nguyên dương xác định chi phí nhiên liệu
đi qua ô đó, m là số dòng và n là số cột của lưới Các dòng được đánh số từ 1 đến m từ trên xuống dưới, các cột được đánh số từ 1 đến n từ trái qua phải Robot cũng đã được
biết trước toạ độ điểm xuất phát và điểm đích cần tới
Yêu cầu: Cho biết bản đồ địa hình và toạ độ các điểm đầu, cuối đường đi Hãy tính
nhiên liệu cần nạp
Dữ liệu: Vào từ file văn bản ROBOT.INP, gồm nhiều bộ dữ liệu:
•Dòng đầu tiên chứa số nguyên t - số bộ tests trong file,
•Mỗi test bao gồm một nhóm dòng, trong đó:
o Dòng đầu tiên chứa 2 số nguyên m n,
o m dòng tiếp theo: mỗi dòng chứa n số nguyên, mô tả một dòng của bản đồ,
o dòng cuối cùng chứa 4 số nguyên xác định toạ độ ô xuất phát và ô đích
Kết quả: Đưa ra file văn bản ROBOT.OUT: với mỗi test đưa ra một số nguyên trên
một dòng xác định lượng nhiên liệu cần nạp
Trang 31đi hiện tại có nhỏ hơn giá trị đã có tại ô (i,j) đó không, nếu nhỏ hơn thì cập nhật lại ô đó
và tiếp tục thuật toán, còn không kết thúc đường đi đó
Trang 33Dạng 3: Tìm đường đi tối ưu của nhiều đối tượng.
Có một số bài toán sử dụng thuật toán loang nhưng không chỉ yêu cầu loang tìmđường đi của một mà có thể của nhiều đối tượng Vì vậy trong chương trình cần cài đặtnhiều thủ tục loang hoặc lồng ghép trong một thủ tục Hai bài toán dưới đây thuộc trườnghợp như vậy:
Bài 1 Hỏa hoạn
Dũng đang làm việc trong một mê cung Không may, một phần của mê cung bị bắtlửa, và công việc đành phải dừng lại để lên kế hoạch thoát ra ngoài
Biết trước vị trí của Dũng ở trong mê cung và ô vuông có lửa, hãy xác định xemliệu Dũng có thể thoát khỏi mê cung trước khi bị lửa cháy hay không, và anh ta có thểthoát ra nhanh nhất trong thời gian bao lâu
Dũng và lửa di chuyển với tốc độ 1 ô vuông/ phút theo chiều dọc hoặc chiều ngang Dũng có thể thoát khỏi mê cung từ 1 ô bất kỳ ở ngoài biên của mê cung Mê cung có cácbức tường và cả Dũng lẫn lửa không thể di chuyển vào đó
Dữ liệu vào: Tệp văn bản hoahoan.inp:
- Dòng đầu tiên chứa 2 số nguyên dương M và cho biết số hàng và số cột của mê
cung (M,N<=1000)
- M dòng tiếp theo mô tả mê cung, mỗi dòng có đúng N ký tự, mỗi ký tự có thể là:+) Ký tự # Một bức tường
+) Ký tự thể hiện 1 ô vuông
+) J: Vị trí ban đầu của Dũng
+) F: 1 ô vuông mà tại đó có lửa
Dữ liệu ra: Tệp hoahoan.out
Một số nguyên cho biết thời gian (tính bằng phút) nhanh nhất mà Dũng có thể thoát
ra khỏi mê cung hoặc số -1 nếu không thể
Trang 34Trong chương trình cần xây dựng 2 thủ tục loang của Dũng và của lửa Dùng 2mảng lưu thời gian đường đi của Dũng và lửa đến các ô ngoài biên So sánh giá trị 2mảng có cùng chỉ số để tìm ra các ô và thời gian thỏa mãn yêu cầu.
Trang 38Tại thời điểm xuất phát, Robot thứ nhất được đặt tại ô (1,1), mỗi bước chỉ đượcphép di chuyển sang ô kề cạnh bên phải, hoặc xuống ô kề cạnh bên dưới hoặc xuống ô kềđỉnh phía dưới bên phải
Robot thứ hai được đặt tại ô (1,n), mỗi bước chỉ được phép di chuyển sang ô kềcạnh bên trái hoặc xuống ô kề cạnh bên dưới hoặc xuống ô kề đỉnh phía dưới bên trái.Bắt đầu từ thời điểm xuất phát được tính là 0, hai Robot phải di chuyển liên tục theoqui tắc đã nêu Thời gian di chuyển từ một ô sang ô kế tiếp được tính là 1 giây Nhiệm vụcủa đội chơi là phải lập trình điều khiển hai Robot xuất phát cùng lúc, di chuyển tránhchướng ngại vật để gặp nhau tại một ô vuông không có chướng ngại vật Hai Robot gặpnhau càng sớm đội chơi càng được nhiều điểm Lưới ô vuông được thiết kế đảm bảo làluôn có cách đi để hai Robot gặp được nhau
Yêu cầu: Hãy tìm cách điều khiển sao cho hai Robot gặp nhau ở thời điểm sớm
nhất
Input: Tệp văn bản robocon.inp:
Dòng thứ nhất chứa hai số nguyên dương n, k (n ≤ 500, k ≤ 10000)
Dòng thứ i trong số k dòng tiếp theo chứa 2 số nguyên dương ui, vi tương ứng là tọa
độ hàng và cột của ô có đặt chướng ngại vật (i = 1, 2, , k)
Các số trên cùng một dòng được ghi cách nhau ít nhất một dấu cách
Output: Tệp robocon.out:
Ghi ra một số nguyên dương là thời điểm sớm nhất tìm được
Ví dụ: