Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 17 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
17
Dung lượng
111,15 KB
Nội dung
***Ngăn xếp hàng ñợi*** Cấu trúc ngăn xếp hàng ñợi ***** Nguyễn ðức Huy Tin Lê Khiết 2006-2009 A - Cấu trúc ngăn xếp (stack) : I, Khái niệm : 1, ðịnh nghĩa : -ðây kiểu liệu mà việc cập nhật truy nhập ñều theo nguyên tắc "Vào sau trước"( Last In, Firt Out) 2, Khai báo : Var stack:array[1 1000] of byte; Dst:integer; n Ý nghĩa : phần tử ñưa vào cuối ñược lấy ñầu tiên II, Một số thủ tục hàm cần dùng : -Khởi tạo procedure init; begin dst:=0; end; -Kiểm tra xem Stack ñã rỗng chưa Function StackEmpty:Boolean; Begin StackEmpty:= (dst=0); End; -ðưa phần tử vào procedure push(x:byte); begin inc(dst); stack[dst]:=x; end; -Lấy phần tử function pop:byte; begin pop:=stack[dst]; dec(dst); end; -ðọc phần tử ngăn xếp function get:byte; begin get:=stack[dst]; end; III, Ví dụ : Trang 1/17 ***Ngăn xếp hàng ñợi*** Dùng ngăn xếp ñể duyệt sâu Procedure DFS; Var x,i:integer; Begin Push(1); Repeat Pop(x); For i:=n downto If (a[x,i]=1)and(kt[i]=false) then Begin Push(i); Kt[i]:=true; End; Until dst=0; End; ðường ñi ngắn Cho lưới ô vuông m x n (1j; If i < r then Begin S : = s+1 ; Stack [s] : = 1; Stack [s] r : + r ; End; r : = j; Until 1> r ; Until S= 0; End; Thuật toán tô màu ñồ thị Bài tập áp dụng : Cho bảng vuông n x n Tại ô (i,j) ô ñen, lại ñều ô trắng Tìm cách ñặt sau cho dòng, cột có ñúng ô ñen B - Cấu trúc hàng ñợi (queue) : B1 – Hàng ñợi bình thường : I, Khái niệm: 1, ðịnh nghĩa : -Khác với Stack, Queue kiểu liệu trừu tượng mà chế cập nhật truy xuất xảy hai ñầu khác theo quy tắc vào trước trước ( First In - First Out) 2, Khai báo : Var queue:array[1 1000] of byte; Last, first:integer; Ý nghĩa : với cấu trúc này, phần tử ñưa vào trước ñược lấy trước * Khuyết ñiểm :ðối với hàng ñợi thường thêm vào Last loại bỏ First, phần sử dụng hàng có khuynh hướng di chuyển phía dưới, ñến lúc ñó ta thêm phần tử vào hàng (vì số phần tử tối ña hàng cố ñịnh) Khi ñó ta nói hàng bị tràn II, Một số thủ tục hàm cần dùng : -Khởi tạo Procedure Init; Begin First:=1; Last:=0; End; Trang 9/17 ***Ngăn xếp hàng ñợi*** -Kiểm tra xem hàng ñợi ñã rỗng chưa Function QueueEmpty : Boolean; Begin QueueEmpty : =First>last; End; -ðưa phần tử vào procedure push(x:byte); begin inc(last); queue[last]:=x; end; -Lấy phần tử function pop:byte; begin If not QueueEmpty then begin pop:=queue[first]; inc(first); end; end; n B2 – Hàng ñợi vòng : I, Khai báo : Var queue:array[1 max] of byte; Last, first:integer; Hàng ñợi vòng cải tiến hàng ñợi bình thường ñể sử dụng tối ña mảng hàng ñợi II, Các thủ tục ñược cải tiến : -ðưa phần tử vào procedure push(x:byte); begin last:=(last+1) mod max; { Ta cho vị trí n quay vòng } queue[last]:=x; { giống kim ñồng hồ } end; { sau vòng trở chỗ cũ, ñi hết n vị trí } -Lấy phần tử function pop:byte; begin If not QueueEmpty then N=1 begin pop:=queue[first]; first:=(first+1) mod max; N-1 end; end; B3, Bài tập ví dụ : Dùng hàng ñợi ñể duyệt rộng ñồ thị Trang 10/17 ***Ngăn xếp hàng ñợi*** var a:array[1 250,1 250] of byte; kt:array[1 250] of boolean; Procedure BFS; Var x,i:integer; Begin Push(1); Repeat Pop(x); For i:=1 to n If (a[x,i]=1)and(kt[i]=false) then Begin Push(i); Kt[i]:=true; End; Until first>last; End; Trên bàn cờ vua quốc tế N*N ( nlast; ð x x end; procedure push(m:oo); F x begin last:=(last+1)mod 2500; q[last]:=m; (1,1)->(2,3)->(3,1)->(4,3) end; procedure pop(var x:oo); begin if not empty then begin x:=q[first]; first:=(first+1) mod 2500; end; end; function inside(o:oo):boolean; begin inside:=(1[...]... ** *Ngăn xếp và hàng ñợi*** end; dc:=1; push(otg); end; end; if(i=8)and(dc=0) then restore; until empty; if kq=0 then writeln('Can not'); end; Begin nhap; main; readln; end 3 Bài toán ñong nước : Cho 2 bình dung tích lần lượt là m và n ( lít) Với nguồn nước không hạn chế, dùng 2 bình trên ñể ñong k lít nước với k (0,4) -> (4,0) -> ( 4,4) -> (5,3) Chương trình. .. x,y:shortint; end; var a:array[-1 50,-1 50] of oo; { ô a[i,j] =(0,0) nếu không có mìn và n,kq:byte; chưa ñược ñi qua, (x,y) nếu từ ô (x,y) q:array[1 2500] of oo; ngựa nhảy tới ô (i,j) và (100,100) first,last:integer; nếu có mìn } xp,fn:oo; procedure nhap; var f:text; tg:oo; i,k,j,t:integer; begin Trang 11/17 ** *Ngăn xếp và hàng ñợi*** kq:=0; tg.x:=100; tg.y:=100; assign(f,fi); reset(f); readln(f,n); for... thanh cong'); Trang 16/17 ** *Ngăn xếp và hàng ñợi*** end; procedure KhoiTao; begin write('Nhap n, m va k:'); readln(n,m,k); xp.x:=0;xp.y:=0;xp.tt:=1;xp.truoc:=0; topm:=0;bottomm:=0;topd:=0;bottomd:=0; top:=0 end; BEGIN khoitao; bfs(xp); readln; END Bài tập áp dụng : 1 Bài toán mã ñi tuần : Cho bàn cờ n x n Con mã ñứng tại ô (x0,y0), hãy tìm một ñường ñi ñể con mã ñi qua tất cả các ô bàn cờ, mỗi ô một lần...** *Ngăn xếp và hàng ñợi*** var a:array[1 250,1 250] of byte; kt:array[1 250] of boolean; Procedure BFS; Var x,i:integer; Begin Push(1); Repeat Pop(x); For i:=1 to n do If (a[x,i]=1)and(kt[i]=false) then Begin Push(i);... xp:trangthai; procedure sPush(var s:mangTT;var top:maxQ;u:trangthai); begin top:=top+1; s[top]:=u; end; procedure sPop(s:mangtt;var top:maxQ;var u:trangthai); begin u:=s[top]; top:=top-1; Trang 14/17 ** *Ngăn xếp và hàng ñợi*** end; procedure qPush(var Q:mangTT;var top,bottom:maxQ;u:trangthai); begin top:=top+1; Q[top]:=u; if bottom=0 then bottom:=1; end; procedure qPop(Q:mangtt;var top,bottom:maxQ;var u:trangthai);... v.x:= u.x+u.y-m; v.y:=m;end; 6: if u.x+u.y ... với hàng ñợi thường thêm vào Last loại bỏ First, phần sử dụng hàng có khuynh hướng di chuyển phía dưới, ñến lúc ñó ta thêm phần tử vào hàng (vì số phần tử tối ña hàng cố ñịnh) Khi ñó ta nói hàng. .. ñều ô trắng Tìm cách ñặt sau cho dòng, cột có ñúng ô ñen B - Cấu trúc hàng ñợi (queue) : B1 – Hàng ñợi bình thường : I, Khái niệm: 1, ðịnh nghĩa : -Khác với Stack, Queue kiểu liệu trừu tượng... duyet; end; { } BEGIN Trang 4/17 ** *Ngăn xếp hàng ñợi*** nhap; work; xuat; END Tìm chu trình Euler ñồ thị vô hướng cách sử dụng Stack Chương trình : Var a:array[1 100,1 100] of integer;