10
toán loang theo lớp Nguyễn Tuấn Dũng Tìm kiếm theo chiều rộng (Breadth First Search - BFS) - còn gọi là thuật toán loang và tìm kiếm theo chiều sâu (Depth First Search - DFS) là 2 thuật toán cơ bản trong lý thuyết đồ thị. Mặc dù thuật toán DFS với cấu trúc dữ liệu kiểu ngăn xếp (Stack) tuân theo quy luật LIFO - Last in, First out (vào sau, ra trước) có thể cài đặt dễ dàng bằng đệ quỵ Nhưng vẫn nảy sinh những bài toán mà để giải quyết nó thuận tiện hơn cần có một thuật toán tìm kiếm khác, đó là BFS. Với cấu trúc dữ liệu kiểu hàng đợi (Queue), tuân theo quy luật FIFO - First in, First out (vào trước, ra trước). Cài đặt thuật toán loang không cần dùng đệ quy và cũng không đến nỗi phức tạp, đó là một ưu điểm. Hơn nữa, thuật toán tìm kiếm theo chiều sâu 'đi sâú vào đồ thị, lưu các đỉnh trên đường đi vào ngăn xếp, còn thuật toán tìm kiếm theo chiều rộng 'quét ngang' đồ thị và lưu các đỉnh vào hàng đợị Như ta biết, có thể tồn tại nhiều đường đi từ một đỉnh A đến đỉnh B trên đồ thị. Nếu bằng BFS tìm được một đường đi đầu tiên từ đỉnh A đến đỉnh B thì đường đi đó sẽ là đường đi qua ít đỉnh nhất từ A để đến được B. Nhưng nếu bằng DFS thì ngược lại, đường đi tìm được đầu tiên chưa chắc đã là đường đi qua ít đỉnh nhất. Mà trong một số bài toán, mặc dù vấn đề cần giải quyết có thể được biến đổi, làm cho phức tạp hơn bởi người ra đề nhưng chung qui vẫn có thể đưa về việc tìm đường đi sao cho phải qua ít đỉnh nhất. Khi đó cài đặt thuật toán loang là giải pháp thích hợp. Đối với BFS cơ bản thì các bạn đã từng gặp trên các số báo trước đây của ISM. Tuy nhiên, trong các bài toán cụ thể, mặc dù vẫn với yêu cầu trên nhưng chúng ta lại phải sử dụng thuật toán loang một cách linh hoạt và sáng tạo mới đạt được kết quả mong đợị Một ví dụ minh hoạ cho điều đó được đưa ra trong cách giải bài toán MEET - 'Gặp gỡ' (thi Quốc gia 1998 -1999) dưới đây: Trên một lưới ô vuông M*N (M,N < 100), người ta đặt robot A ở góc trái trên, robot B ở góc phải dướị Mỗi ô của lưới có thể đặt một vật cản hoặc không (ô trái trên và phải dưới không có vật cản). Hai robot bắt đầu di chuyển đồng thời với

[123doc.vn] - thuat-toan-loang-theo-lop.doc

  • Upload
    huando

  • View
    3

  • Download
    0

Embed Size (px)

Citation preview

ton loang theo lp

ton loang theo lp

Nguyn Tun DngTm kim theo chiu rng (Breadth First Search - BFS) - cn gi l thut ton loang v tm kim theo chiu su (Depth First Search - DFS) l 2 thut ton c bn trong l thuyt th. Mc d thut ton DFS vi cu trc d liu kiu ngn xp (Stack) tun theo quy lut LIFO - Last in, First out (vo sau, ra trc) c th ci t d dng bng qu Nhng vn ny sinh nhng bi ton m gii quyt n thun tin hn cn c mt thut ton tm kim khc, l BFS. Vi cu trc d liu kiu hng i (Queue), tun theo quy lut FIFO - First in, First out (vo trc, ra trc). Ci t thut ton loang khng cn dng quy v cng khng n ni phc tp, l mt u im. Hn na, thut ton tm kim theo chiu su 'i s vo th, lu cc nh trn ng i vo ngn xp, cn thut ton tm kim theo chiu rng 'qut ngang' th v lu cc nh vo hng Nh ta bit, c th tn ti nhiu ng i t mt nh A n nh B trn th. Nu bng BFS tm c mt ng i u tin t nh A n nh B th ng i s l ng i qua t nh nht t A n c B. Nhng nu bng DFS th ngc li, ng i tm c u tin cha chc l ng i qua t nh nht. M trong mt s bi ton, mc d vn cn gii quyt c th c bin i, lm cho phc tp hn bi ngi ra nhng chung qui vn c th a v vic tm ng i sao cho phi qua t nh nht. Khi ci t thut ton loang l gii php thch hp. i vi BFS c bn th cc bn tng gp trn cc s bo trc y ca ISM. Tuy nhin, trong cc bi ton c th, mc d vn vi yu cu trn nhng chng ta li phi s dng thut ton loang mt cch linh hot v sng to mi t c kt qu mong Mt v d minh ho cho iu c a ra trong cch gii bi ton MEET - 'Gp g' (thi Quc gia 1998 -1999) di y: Trn mt li vung M*N (M,N < 100), ngi ta t robot A gc tri trn, robot B gc phi d Mi ca li c th t mt vt cn hoc khng ( tri trn v phi di khng c vt cn). Hai robot bt u di chuyn ng thi vi tc nh nhau v khng robot no c dng li trong khi robot kia di chuyn (tr khi n khng th i c na). Ti mi bc, robot ch c th di chuyn theo 4 hng - i ln, i xung, sang tri, sang phi - vo cc k cnh. Hai robot s gp nhau nu chng ng trong cng mt vung. Bi ton t ra l tm cch di chuyn t nht m 2 robot phi thc hin c th gp nhau. D liu vo trong file Meet.inp : - dng u ghi 2 s M,N.- M dng tip theo, mi dng ghi N s 0 hoc 1 m t trng thi ca cc vung: 1-c vt cn, 0-khng c vt cn.Cc s trn cng mt dng ca file d liu cch nhau t nht mt du trng.Kt qu ghi ra file Meet.out :- nu 2 robot khng th gp nhau th ghi k t #.- Ngc li, ghi hai dng, mi dng l mt dy cc l t vit lin nhau m t cc bc i ca robot : U-i ln, D-i xung, L- sang tri, R- sang ph Dng u l cc bc i ca A, dng sau l ca B.

V d: Meet.inp 4 6 0 1 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 10 1 0 1 0 0Meet.outDRRRLULU Vi dng bi kiu ny th ai cng ngh ngay n thut ton loang. Nhng loang nh th n v ta c hai robot cng di chuyn. V tt nhin, bi ton ny tr nn hay hn so vi cc bi loang thng thng. Chc hn ai cng bit mt th nghim ph bin v s giao thoa sng: 'cho 2 chic kim (khng cch xa nhau lm) dao ng cng tn s trn mt nc, khi c th quan st thy nhng vng trn ng tm trn mt nc c loang rng dn ra cho n mt lc no , 2 vng trn u tin c to ra bi s dao ng ca 2 chic kim ny gp nhau, giao thoa vi nha.

T th nghim , chng ta c th a ra cch di chuyn cho 2 robot theo kiu loang chiu rng, nhng ch loang tng lp, tng lp mt i vi mi robot, ging nh 2 vng trn loang rng dn ra trn mt nc.

V mt tng th s loang ca 2 robot l song song, ng thi vi nha Nhng bt tay vo lm c th th khng cho php chng ta ci t thut ton theo kiu song song V th cch gii quyt ca ti l s dng mt vng lp (Procedure Strati-BFS) thc hin lun phin 2 th tc: c cho robot 1 loang ra mt lp mi xung quanh (Procedure BFSRobot1) th dng li cho robot 2 cng loang ra mt lp xung quanh khc (Procedure BFSRobot2). Vng lp s kt thc nu hai lp va mi loang ca 2 robot ny giao nhau (PathFound - 2 robot s gp c nhau) hoc c hai robot u khng th di chuyn c na (Stoped - bi ton v nghim). Ti tm gi y l thut ton 'loang theo lp'. Bn cht ny thc ra tn ti trong cch lp ca thut ton loang c bn v y, vic khai thc c n gip chng ta gii quyt tt vn t r Tuy nhin, khi nim lp y nn hiu nh th n Cc bn bit trong cch lp ca BFS th ti mi ln lp, ta s ly ra (get out) cc nh trong hng i t Queue[first] n Queue[last] a vo (put in ) hng i cc nh khc k vi cc nh ly r Sau cc bin first, last s c iu chnh tr thnh v tr u v v tr cui ca on cha cc nh mi ny trong Queue (xem Procedure BFSRobot1; v Procedure BFSRobot2;). Chng ta gi tp hp cc nh t Queue[first] n Queue[last] trong mi bc lp ca BFS l mt lp. Di y l chng trnh gi Trong trng trnh c s dng mt s th thut c bn kh quen thuc trong bi ton tm ng i trn li vung nh k thut 'r - vin xung quanh mng A bng cc s 1 khng phi kim tra iu kin vt khi gii hn ca li trong qu trnh di chuyn robot: A[0,j] = A[M+1,j] = A[i,0] = A[i,N+1] = 1 (i = 1,..., M ; j = 1,... N). V 2 mng hng Hi, Hj gip ta c th dng vng for thc hin 4 hng i L, U, R, D d dng hn trong khi loang, thun tin cho vic vit chng trnh. Mng New1 c dng nh du cc vung thuc lp m robot 1 va loang ti, khi cho robot 2 loang nu gp phi mt trong cc ny th ngha l tm c nghim ca bi ton. C th tit kim b nh nu khng dng New1, m nh du ngay bng mng A vi cch cng thm 100 vo A[x,y] nu (x,y) thuc lp m robot 1 va loang ti (v A[x,y] ch ghi ton s 1 hoc s 0). Hai mng Q1, Q2 l hng i cho vic loang robot 1 v robot 2. Nu cn tit kim b nh c th s dng chung mt hng i Q cho vic loang ca 2 robot, robot 1 s dng phn u t Q[1] tr i cn robot 2 s dng phn cui t Q[max*max] tr li, v tng s vung m c 2 robot i qua khng vt qu kch thc li M*N cho n khi hai lp loang ca 2 robot giao nhau, m vng lp li c kt thc ngay ti y (ti th ci t kiu ny, chng trnh vn chy ra kt qu ng).Cn vic nh du ng i c thc hin bi cch cng thm k vo A[x,y] nu (x,y) l c i n t trc theo hng k (s t nhin k chy t 1 n 4 ln lt ch 4 hng i ca robot: L, U, R, D). xm,ym l to vung 2 robot gp nha Phi s dng thm bin pred2 ghi nhn hng m t Robot 2 i ti (xm,ym) v A (xm,ym) dng ghi nhn hng m t Robot 1 i n gp nhau. Vic tm li ng i cho tng robot c thc hin trong procedure FindS1S2.Trong khun kh bi bo, khng th gii thch k chng trnh, v vy cc bn c th nghin cu chi tit thm qua chng trnh gii c th di y: Uses Crt;Const Inf = 'Meet.inp';Outf = 'Meet.out';Max = 100;Hi : Array[1..4]of integer = (0,-1,0,1);Hj : Array[1..4]of integer = (-1,0,1,0);Type Square=record x,y:byte; end;Var A : Array[0..Max+1,0..Max+1]of byte;Q1,Q2 : Array[1..Max*Max]of square;New1 : Array[0..Max+1,0..Max+1]of Boolean;First1,Last1,First2,Last2,N,M,Pred2,Xm,Ym : Word;PathFound,Stoped : boolean;S1,S2 : string;Procedure Readinp;var f:text; i,j:word;Beginfillchar(A,sizeof(A),1); {ro xung quanh}assign(f,inf); reset(f);readln(f,M,N);for i:=1 to M dobeginfor j:=1 to N do read(f,a[i,j]);readln(f);end;close(f);End;Procedure Init;Beginfirst1:=1; last1:=1;Q1[1].x:=1; Q1[1].y:=1;first2:=1; last2:=1;Q2[1].x:=M; Q2[1].y:=N;End;Procedure BFSRoBot1;var x,y,i,j,k:word;beginj:=last1;for i:=first1 to last1 dofor k:=1 to 4 dobeginx:=Q1[i].x + Hi[k];y:=Q1[i].y + Hj[k];if A[x,y]=0 thenbegininc(A[x,y],k);inc(j);Q1[j].x:=x; Q1[j].y:=y;New1[x,y]:=true;end;end;first1:=last1+1; last1:=j;if first1>last1 then Stoped:=true;end;Procedure BFSRoBot2;var x,y,i,j,k:word;beginj:=last2;for i:=first2 to last2 dobeginfor k:=1 to 4 dobeginx:=Q2[i].x + Hi[k];y:=Q2[i].y + Hj[k];if A[x,y]=0 thenbegininc(A[x,y],k);inc(j);Q2[j].x:=x; Q2[j].y:=y;end;if New1[x,y] then beginPathFound:=true;Pred2:=k;xm:=x; ym:=y;Exit;end;end;end;first2:=last2+1; last2:=j;if first2>last2 then Stoped:=true;end;Procedure StratiBFS;BeginPathFound:=False;Stoped:=False;Repeatfillchar(New1,sizeof(New1),false);BFSRoBot1;BFSRoBot2;Until Pathfound or Stoped;End;Procedure FindS1S2;var x,y,k:byte;begins1:=''; s2:='';x:=xm; y:=ym;{RoBot1}repeatk:=A[x,y];case k of1 : s1:=s1+'L';2 : s1:=s1+'U';3 : s1:=s1+'R';4 : s1:=s1+'D';end;x:=x-Hi[k];y:=y-Hj[k];until (x=1)and(y=1);{RoBot2}x:=xm; y:=ym; A[x,y]:=Pred2;repeatk:=A[x,y];case k of1 : s2:=s2+'L';2 : s2:=s2+'U';3 : s2:=s2+'R';4 : s2:=s2+'D';end;x:=x-Hi[k];y:=y-Hj[k];until (x=M)and(y=N);end;Procedure WriteOut;var f:text; i,j:byte;beginassign(f,outf); rewrite(f);If not(pathfound) thenbeginwrite(f,'#'); close(F); exit;end;FindS1S2;for i:=length(s1) downto 1 do write(f,s1[i]);writeln(f);for i:=length(s2) downto 1 do write(f,s2[i]);close(f);end;BEGINReadinp;Init;StratiBFS;WriteOut;END.Chng ta cn ch rng, bi ton c th c nhiu nghim v tn ti nhiu cch i t gc tri trn n gc phi d Hoc, tu thuc vo trng thi ca li, hai robot s c th khng bao gi gp nha Trng hp xy ra kh hin nhin khi khng tn ti ng i t (1,1) n (M,N), hoc tn ti, nhng ng i c di chn (ta tm gi di ng i l tng s nh trn ng i ). V hai robot ch c th gp nhau nu nh c mt ng i di l t (1,1) n (M,N). C th chng minh iu ny: gi s 2 robot gp nhau (xm,ym) th ng i t (1,1) n (xm,ym) phi bng ng i t (M,N) n (xm,ym) v gi s bng d , khi tng di ng i t (1,1) n (M,N) s bng (2d - 1) l mt s l. Nh vy, y cng l mt hng gii quyt bi ton ny, tc l tm ng i di l ngn nht t gc tri trn n gc phi d chnh l con ng hai robot gp nhau m s bc di chuyn cn thit l t nht. Tuy nhin, ti khng tm li gii theo cch , phn ny dnh cho bn c t lm thm. tng loang theo tng lp trn, khng ch gii bi ton Meet m hy vng rng n cn c tc dng trong cc ng dng khc ca bn.

M bi: ROBOCON

Cuc thi vng loi Robocon nm nay c ch "Gp g". Cc Robot s tranh ti trn mt li vung gm n hng n ct. Cc hng ca li c nh s t 1 n n, t trn xung di. Cc ct ca li c nh s t 1 n n, t tri sang phi. Trn k vung ca li c t chng ngi vt. phn thi Robot t ng, mi i s phi s dng ng thi hai con Robot.

Ti thi im xut pht, Robot th nht c t ti (1,1), mi bc ch c php di chuyn sang k cnh bn phi, hoc xung k cnh bn di hoc xung k nh pha di bn phi.

Robot th hai c t ti (1,n), mi bc ch c php di chuyn sang k cnh bn tri hoc xung k cnh bn di hoc xung k nh pha di bn tri.

Bt u t thi im xut pht c tnh l 0, hai Robot phi di chuyn lin tc theo qui tc nu. Thi gian di chuyn t mt sang k tip c tnh l 1 giy. Nhim v ca i chi l phi lp trnh iu khin hai Robot xut pht cng lc, di chuyn trnh chng ngi vt gp nhau ti mt vung khng c chng ngi vt. Hai Robot gp nhau cng sm i chi cng c nhiu im. Li vung c thit k m bo l lun c cch i hai Robot gp c nhau.

Yu cu: Hy tm cch iu khin sao cho hai Robot gp nhau thi im sm nht.

Rng buc: 50% s tests ng vi 50% s im ca bi c n 100.

Input

Dng th nht cha hai s nguyn dng n, k (n 500, k 10000).

Dng th i trong s k dng tip theo cha 2 s nguyn dng ui, vitng ng l ta hng v ct ca c t chng ngi vt (i = 1, 2, ..., k).

Cc s trn cng mt dng c ghi cch nhau t nht mt du cch.

Output

Ghi ra mt s nguyn dng l thi im sm nht tm c.

Example

Input:5 52 21 42 33 54 2

Output:3