THUẬT TOÁN LOANG

34 382 0
THUẬT TOÁN LOANG

Đ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

THUẬT TOÁN LOANG I) ĐẶT VẤN ĐỀ: Thuật toán Loang thực chất thuật toán tìm kiếm theo chiều rộng đồ thị (Breadth First Search) Để hiểu rõ chất thuật toán này, ta xét toán ‘Thăm đỉnh đồ thị’ sau: Cho đồ thị vô hướng G = (V,E), N đỉnh M cạnh (số hiệu đỉnh 1,2, …,N) Bây ta đưa thứ tự duyệt đỉnh đồ thị cho theo thuật toán tìm kiếm theo chiều rộng; thứ tự duyệt đỉnh v Tư tưởng thuật toán sử dụng cấu trúc liệu kiểu hàng đợi (QUEUE - vào trước trước) Phần tử nạp vào QUEUE đỉnh v Sau đỉnh p lấy khỏi QUEUE ta thăm đỉnh đồng thời nạp vào QUEUE đỉnh chung cạnh với p (chỉ nạp vào đỉnh chưa xét đến) Quá trình lặp lặp lại QUEUE rỗng dừng  Chương trình mô phỏng: Ban đầu tất đỉnh i (i = n) đặt cờ chuaxet[i] = True Nếu đỉnh xét ta đặt cờ đỉnh sang trạng thái False Procedure BFS(v); Tìm kiếm theo chiều rộng đỉnh v Begin QUEUE = ; {Khởi tạo QUEUE ban đầu rỗng} QUEUE cờ v False} While QUEUE ≠ Begin P i + Hi[2] = i + 0, có nghĩa số hàng không đổi (3) Hj[r] = Hj[2] = -1 => j + Hj[2] = j – , có nghĩa số cột giảm đơn vị (4) (3) (4) thao tác di chuyển đến ô chung cạnh phía bên trái (sang trái) - Tương tự với giá trị khác r Với vấn đề nêu trên, chương trình cải tiến lại sau: Program Bai3_hsg12_09; Uses Crt; Const 25 Hi:Array[1 4] of Integer=(-1,0,1,0); Hj:Array[1 4] of Integer=(0,-1,0,1); Nmax=100; Mmax=100; fi='robot.inp'; fo='robot.out'; Type HC=Record h,c:Byte; End; Var f:Text; s:char; A:Array[0 Mmax+1,0 Nmax+1] of Byte; Q:Array[1 Mmax*Nmax] of HC; M,N,k,l,i,j,dem,dau,cuoi,h,o:Integer; Procedure Doctep; Begin Fillchar(A,Sizeof(A),1);{Rao xung quanh} Assign(f,fi); Reset(f); Readln(f,M,N,k,l,h,o); For i:=1 to M Begin dem:=0; While not eoln(f) Begin Read(f,s); dem:=dem+1; if s='1' then A[i,dem]:=1; if s='0' then A[i,dem]:=0; End; Readln(f); End; Close(f); End; Procedure Loang_Rao; Var x,y,r:Byte; Begin dau:=1; cuoi:=1; Q[dau].h:=k; Q[dau].c:=l; A[k,l]:=5; While daucuoi1 then ST:=True; End; Procedure Loang2; Var k,h,c:Byte; Begin j:=cuoi2; For i:=dau2 to cuoi2 For k:=1 to Begin h:=Q2[i].h + Hi[k]; c:=Q2[i].c + Hj[k]; If A[h,c]=0 then Begin Inc(j); Q2[j].h:=h; Q2[j].c:=c; A[h,c]:=k; End; If B[h,c] then Begin lk:=k; hm:=h; cm:=c; TT:=True; Exit; End; End; 32 dau2:=cuoi2+1; cuoi2:=j; if dau2>cuoi2 then ST:=True; End; Procedure Loang_lop; Begin TT:=False; ST:=False; While (ST=False) and (TT=False) Begin FillChar(B,SizeOf(B),False); {Danh dau theo tung lop loang} Loang1; Loang2; End; End; Procedure Ketqua; Var k:Byte; s1,s2:String; Begin s1:=''; s2:=''; Assign(f,fo); Rewrite(f); If TT=False then Writeln(f,'#') else Begin {Duong di cua Robot1} i:=hm; j:=cm; Repeat k:=A[i,j]; Case k of 1: s1:=s1+'D'; 2: s1:=s1+'L'; 3: s1:=s1+'U'; 4: s1:=s1+'R'; End; i:=i+Hi[k]; j:=j+Hj[k]; Until (i=1) and (j=1); {Duong di cua Robot2} i:=hm; j:=cm; A[i,j]:=lk; Repeat k:=A[i,j]; Case k of 1: s2:=s2+'D'; 2: s2:=s2+'L'; 3: s2:=s2+'U'; 33 4: s2:=s2+'R'; End; i:=i+Hi[k]; j:=j+Hj[k]; Until (i=M) and (j=N); For i:=Length(s1) downto Write(f,s1[i]); Writeln(f); For i:=Length(s2) downto Write(f,s2[i]); End; Close(f); End; BEGIN Doctep; KT_Queue; Loang_lop; Ketqua; END Bài 7: Chuyển bi Người ta vẽ N vòng tròn (N≤100) tô màu cho chúng (có thể có số vòng tròn có màu), vòng tròn đánh số từ tới N Các cặp vòng tròn nối với cung định hướng, cung có màu định Các màu (của cung vòng tròn) đánh sốtừ tới N Người ta chọn số nguyên khác L, K Q (1 ≤ L,K,Q ≤ N) Đặt vào vòng tròn số L K vòng bi, sau bắt đầu di chuyển bi theo nguyên tắc: - Bi chuyển theo cung có màu trùng với màu vòng tròn chứa viên bi thứ hai; - Bi chuyển theo chiều cung; - Hai viên bi không đồng thời vòng tròn; - Quá trình di chuyển kết thúc hai viên bi tới vòng tròn Q Hãy xác định cách di chuyển để chấm dứt trình sau số bước chuyển Dữ liệu vào tệp văn bi.inp có cấu trúc: - Dòng đầu ghi số nguyên N, L, K, Q; - Dòng thứ ghi số N số nguyên C1, C2, … , CN (Ci màu vòng tròn thứ i); - Dòng thứ ghi số nguyên nguyên M (0 ≤ M ≤ 10000); - M dòng tiếp theo, dòng ghi số nguyên A i, Bi, Di xác định cung màu D i từ vòng tròn Ai tới vòng tròn Bi ; - Các số dòng ghi cách ký tự trống Dữ liệu tệp văn bi.out ghi số nguyên xác định số bước chuyển tối thiểu kết thúc trình di chuyển Nếu không kết thúc trình di chuyển ghi ký tự ‘#’ 34 [...]... bài toán như vậy thì ta nghĩ ngay đến thuật toán Loang để tìm đường đi cho 2 Robot Như vậy là phải loang từ 2 phía (loang của Robot A và loang của Robot B) Nhưng vì 2 Robot di chuyển đồng thời trong khi không cho phép ta cài đặt việc loang song song từ 2 phía nên ta phải thiết kế loang thế nào cho hợp lý Xin đề xuất một ý tưởng loang như sau: Cứ Robot A loang 1 lớp thì dừng lại để Robot B loang. .. Tệp robot.out: Khong co duong di Phân tích: 21 Yêu cầu của bài toán thực chất là tìm đường đi từ ô [K,L] đến ô [H,O] sao cho qua ít ô vuông nhất Ta dễ thấy thuật toán để xử lý một cách hợp lý nhất là thuật toán Loang Ta bắt dầu loang từ ô [K,L], nếu loang đến được ô [H,O] thì có đường đi, ngược lại không có đường đi Hàng đợi phục vụ loang được thể hiện bởi mảng 2 chiều Q:Array[1 2,Mmax*Max] of... với hướng loang đến nên khi Robot B loang đến ô [h,c] buộc ta phải lưu lại giá trị tương ứng với hướng loang vào biến lk để sau này truy xuất đường đi của Robot B Quá trình loang theo từng lớp của 2 Robot được thực hiện như sau: Procedure Loang_ lop; Begin TT:=False; ST:=False; While (ST=False) and (TT=False) do Begin FillChar(B,SizeOf(B),False); {Đánh dấu theo từng lớp loang} Loang1 ; Loang2 ; End;... 2 Robot gặp nhau tại một ô hoặc 1 trong 2 Robot dừng loang Một lớp loang ở đây là loang từ các phần tử hiện có trong hàng đợi (từ phần tử Queue[dau] đến phần tử Queue[cuoi]) Sau mỗi lớp loang , biến dau và biến cuoi lại được điều chỉnh để trở thành vị trí đầu và vị trí cuối của các phần tử mới trong 28 Queue Ta có thể mô tả cụ thể các lớp loang của 2 Robot với dữ liệu vào là tệp robot.inp thứ... the 4 khong thu duoc the 5 5421 Bo the 3 vao cua 1 thu duoc the 1 2 2 2 4 2351 3443 1444 1524 1524 5321 1122 3424 3424 Phân tích: Bài toán trên thuộc lớp các bài toán biến đổi trạng thái Hơn nữa yêu cầu tìm kết quả qua ít bước thao tác nhất nên ta sử dụng thuật toán Loang là thích hợp nhất Cụ thể như sau: Ta sử dụng ma trận A[i,j] (i = 1 N, j = 1 M) để lưu giữ thông tin quan hệ giữa thẻ - cửa đã cho... việc loang , nếu P[H,O] = 0 thì điều có có nghĩa là ô [H,O] chưa được loang đến (không có đường đi), nếu P[H,O] = r (r=1 4 - loang theo 4 hướng) thì dựa vào hướng loang đến mà ta tìm được ô trước đó, rồi ta lại dựa vào giá trị k của ô tìm được ta tìm được ô trước đó nữa quá trình trên kết thúc khi tìm được ô [K,L] Sau khi loang xong thì giá trị các phần tử trong mảng Q không còn giá trị sử dụng... cách gán giá trị tương ứng với hướng loang} B[h,c]:=True; {Dấu hiệu cho Robot B nhận biết đã gặp Robot A} End; End; dau1:=cuoi1 + 1; cuoi1:=j; {Điều chỉnh lại biến dau1, cuoi1 cho các phần tử mới trong Q1} If dau1 > cuoi1 then ST:=True; {ST=True là Q1 rỗng, kết thúc loang } End; Việc loang theo lớp của Robot B cũng tương tự như Robot A nhưng chỉ khác ở chổ khi loang đến một ô [h,c] nào đó thì phải... lại giá trị tương ứng với hướng loang để lấy kết quả} hm:=h; {Lưu lại chỉ số hàng của ô mà 2 Robot gặp nhau để lấy kết quả} cm:=c; {Lưu lại chỉ số cột của ô mà 2 Robot gặp nhau để lấy kết quả} TT:=True; {Dấu hiệu dừng loang của 2 Robot vì đã gặp nhau} Exit; End; Sở dĩ ta phải lưu lại giá trị tương ứng với hướng loang (lk:=k) là vì tại ô gặp nhau [h,c] Robot A đã loang đến trước nên đã gán giá... để đánh dấu những ô đã loang đến; đồng thời để phục vụ cho việc truy xuất đường đi sau này nên khi ô [i,j] được loang đến thì P[i,j] được gán giá trị là r (r là giá trị tương ứng với hướng mà ô trước đó loang đến, hướng nào tương ứng với giá trị k bao nhiêu tuỳ theo quy định, ví dụ r = 1 - sang phải, 2 - đi xuống, 3 - sang trái, 4 - đi lên) Sau khi thực hiện xong việc loang , nếu P[H,O] = 0 thì... {Đánh dấu theo từng lớp loang} Loang1 ; Loang2 ; End; End; Lệnh đánh dấu theo từng lớp loang tại vị trí như ở trên: FillChar(B,SizeOf(B),False) là rất quan trọng vì Robot B gặp Robot A tại ô [h,c] chỉ khi B[h,c] = True tại thời điểm lớp loang của Robot A cùng lớp loang với Robot B Còn nếu B[h,c] = True của lớp loang trước nào đó của Robot A thì không thể kết luận 2 Robot gặp nhau vì khi đó 2 Robot ... tích: 21 Yêu cầu toán thực chất tìm đường từ ô [K,L] đến ô [H,O] cho qua ô vuông Ta dễ thấy thuật toán để xử lý cách hợp lý thuật toán Loang Ta bắt dầu loang từ ô [K,L], loang đến ô [H,O]... Với dạng toán ta nghĩ đến thuật toán Loang để tìm đường cho Robot Như phải loang từ phía (loang Robot A loang Robot B) Nhưng Robot di chuyển đồng thời không cho phép ta cài đặt việc loang song... phải thiết kế loang cho hợp lý Xin đề xuất ý tưởng loang sau: Cứ Robot A loang lớp dừng lại để Robot B loang lớp, trình lặp lặp lại Robot gặp ô Robot dừng loang Một lớp loang loang từ phần

Ngày đăng: 07/12/2015, 13:24

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

Tài liệu liên quan