1. Trang chủ
  2. » Trung học cơ sở - phổ thông

Các bài toán di chuyển

9 2,3K 0

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

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 9
Dung lượng 93,5 KB

Nội dung

Trong các kỳ thi học sinhgiỏi ta thường gặp một số bài toán có yếu tố di chuyển. Nội dung của những bàitoán này thường được phát biểu như sau: MộtRobot di chuyển trong một mê cung hình chữ nhật ABCD được chia thành các ôvuông đơn vị. Gốc toạ độ đặt tại điểm A (0,0). Robot đứng tại điểm R(x0,y0) làvị trí xuất phát, mặt hướng về phíaBắc, tức là nhìn về phía cạnh BC như trong Hình 1. Biết luật di chuyển củaRobot, hãy xác định vị trí kết thúc của Robot.

Các toán di chuyển Nguyễn Xuân Huy Trong kỳ thi học sinhgiỏi ta thường gặp số toán có yếu tố di chuyển Nội dung bàitoán thường phát biểu sau: MộtRobot di chuyển mê cung hình chữ nhật ABCD chia thành ôvuông đơn vị Gốc toạ độ đặt điểm A (0,0) Robot đứng điểm R(x0,y0) làvị trí xuất phát, mặt hướng phíaBắc, tức nhìn phía cạnh BC Hình Biết luật di chuyển củaRobot, xác định vị trí kết thúc Robot Bài toán bổ sung thêm số điều kiệnnhư đặt lượng đặt bẫy số ô Nếu Robot gặp lượng sựvận động mạnh hơn, chẳng hạn bước qua ô, ngượclại, Robot gặp bẫy, sức khoẻ suy giảm, bước di chuyển ngắnhơn trước Bố trí thêm tường ngăn để tạo mê cung, ta biến hoábài toán thành nhiều dáng vẻ khác Đương nhiên người ta khôngbịa ranhững toán để hành hạ học sinh Đây toán điều khiển Robot cóthực đời thường Giải làm chủ thuật toán di chuyển nói trênchúng ta có đóng góp giá trị cho lĩnh vực điều khiển Robot Sau xin giới thiệu với bạn đọc toán cỡ trungbình số toán điều khiển Robot Bài toán (Robot):Một Robot di chuyển phẳngchia thành lưới toạ độ nguyên ABCD Hình Gốc toạ độ đặt điểm Ă0,0).Robot xuất phát từ điểm R(x0,y0), mặt hướng phía cạnh BC gọi hướng Bắc vàđi theo chương trình lập sẵn Yêu cầu: Xácđịnh điểm kết thúc T(x1,y1) Robot sau hoàn thành chương trình dichuyển Chương trình lậpsẵn cho Robot xâu kí tự bao gồm dãy lệnh dạng Cm, gọi làlệnh đơn, (u)m, C mộttrong chữ Q, q, D d, m số tự nhiên, u lệnh phức đượctạo từ dãy lệnh đơn lệnh phức Các lệnh đơn có ý nghĩa sau: + Dm: Tiến phia trước m bước, bước lần di chuyển từ mộtđiểm đến điểm theo hướng nhìn Robot + dm: Lùi phía sau m bước + Qm: Quay người m lần, lần quay góc 45 độ theo chiều kim đồnghồ + qm: Quay người m lần, lần góc 45 độ ngược chiều kim đồng hồ + (u)m: thực m lần dãy lệnh u Ta quy ước, nếum = không viết giá trị m Nếu m = đoạn lệnh tương ứng đặttrước m bỏ qua Dữ liệu vào: Tệpvăn bảnROBOT.INP gồm dòng + Dòng thứ nhất: hai số tự nhiên x0 y0 cách dấu cách cho biếtvị trí xuất phát Robot + Dòng thứ hai: Chương trình điều khiển Robot Dữ liệu ra: Tệpvăn ROBOT.OUT gồm dòng chứa hai số tự nhiên x1 y1cách dấu cáchcho biết vị trí kết thúc Robot sau hoàn thành chương trình di chuyển Các giá trị x0và y0, x1 y1 đạt tới 60 nghìn Chương trình Robot bao gồm250 kí tự Trục tung AB chứa toạ độ dòng x, trục hoành AD chứa toạ độ cột y Thí dụ: ROBOT.INP ROBOT.OUT 10 58 (D50Q2D50q3d50qD100)10d2 Bài giải Trước hết ta mở tệp văn ROBOT.INP để đọc liệu vàocác biến x0, y0 chứa toạ độ vị trí xuất phát Robot biến xâu kí tự s chứachương trình điều khiển Robot Chươngtrình s, theo đầu lệnh phức Ta sử dụng kỹ thuật hai pha đểphân tích chương trình Robot thành dòng lệnh ghi bảng Hình2 Các bạn tham khảo Kỹ thuật hai pha số 7/2000 Pha Thủ tục xử lý LenhPhuc gọithủ tục LenhDon gặp lệnh đơn dạng Cm vàgọi đệ quy LenhPhuc gặp lệnh dạng (u)m,trong C bốn chữcái D, d, Q q, u lệnhphức, m số tự nhiên Chương trình sử dụng sau đây: const DauTu = ['(','Q','q','D','d']; ChuSo = ['0' '9']; MN = 250; DauTu kiểu tập chứa kí tự đầu lệnh, trongđó( dấu hiệu đầu lệnh phức, bốn chữ lại dấu hiệu đầucủa lệnh đơn MN cho biết chiều dàitối đa chương trình điều khiển Robot tức chiều dài tối đa xâu kí tựs Thủ tục LenhPhuc đọc kí tự s, nhận biết từngdạng lệnh đơn hay phức để tạo dòng điều khiển tương ứng bảng Bảng tạo cột, mỗicột mảng: Kt: array[0 MN] of char; Tu: array[0 MN] of byte; Lap: array[0 MN] of word; Với dòng n bảng,Kt[n] kí tự điều khiển vận động Robot, Lap[n] cho biết số lần lặp lạimột thao tác quay di chuyển, Nếu Kt[n]=* dòng n dòng lặpứng với lệnh phức, Tu[n] cho biết dòng bảng lệnhphức mà ta cần lặp Sau xử lý dãy lệnh (D50Q2D50q3d50qD100)10 thủ tụcLenhPhuc sinh dòng bảng Dòng cho biết Robot cần lặp lại dãythao tác 10 lần kể từ dòng thứ Biến ii kiểu byte dùng đểduyệt kí tự xâu s, biến n kiểu byte ghi nhận dòng phát sinh trongbảng Các biến khởi trị sau: ii := 1; n := 0; s := s +#; Ta thêm cho s kí tự lạ đểlàm dấu kết dòng đỡ phải kiểm tra giới hạn dẫn ii Procedure LenhPhuc; var g: byte; begin while s[ii] in DauTu if s[ii] = '(' then begin g := n; inc(ii); LenhPhuc; if s[ii]=) then inc(n); Kt[n] := '*'; Tu[n] := g+1; Lap[n] := DocSo; if Lap[n] = then n := g else if Lap[n] = then dec(n); end else LenhDon; end; Thủ tục LenhDon xử lý lệnh đơn dạng C Cm, C mộttrong bốn chữ D, d, Q q, mlà số tự nhiên Thủ tục tạo dòng n cho bảng với hai giá trị: Kt[n]chứa kí tự điều khiển Robot Lap[n]chứa số lần lặp thao tác tương ứng procedure LenhDon; begin inc(n); Kt[n] := s[ii]; inc(ii); Lap[n] := DocSo; if Lap[n] = then dec(n); end; Hàm DocSo đọc dãy chữ số s để tạo số tựnhiên Khi không gặp số, theo quy địnhcủa đầu ta gán DocSo = function DocSo: word; var m: word; begin DocSo := 1; if not (s[ii] in ChuSo) then exit; m := 0; while s[ii] in ChuSo begin m := m*10 + ord(s[ii]) - ord('0'); inc(ii); end; DocSo := m; end; Pha đươc gọi thông quathủ tục TaoBang sau: procedure TaoBang; begin s := s + '#'; ii := 1; n := 0; LenhPhuc; end; Pha Thủ tục DiChuyen phanày điều khiển Robot di chuyển theo dòng bảng tạo lập pha thứnhất Với dòng i=1 n ta xét trường hợp: * Nếu Kt[i] hai chữ Q q tacho Robot xoay người Lap[i] lần theo chiều kim đồng hồ, Kt[i]=Q, hoặcngược chiều kim đồng hồ, Kt[i]=q Để làm việc ta dùng biến nguyênHuong cho biết mặt Robot hướng phía Tính theo chiều kim đồng hồ ta có8 hướng 0: Bắc, 1: Đông-Bắc, 2: Đông, 3: Đông-Nam, 4: Nam, 5: Tây-Nam, 6:Tây, 7: Tây-Bắc Mỗi lần Robot xoay mình, mặt chuyển hướng,vậy sau xoay Lap[i] lần hướng Robot tính sau: Huong:=(Huong+(Lap[i]mod 8)) mod Tươngtự ta lập công thức tính hướng cho trường hợp Kt[i]=q: Huong:=(Huong-(Lap[i]mod 8)); if Huong

Ngày đăng: 18/08/2016, 09:24

TỪ KHÓA LIÊN QUAN

w