You are on page 1of 4

BFS Min 0 l tp hp cc s 0 c chung cnh. Hy vit chng trnh m cc min 0. Input: File loang.

.inp, trong Dng u tin cho bit s dng m, s ct n M dng tip theo biu din bng vung gm cc s 0 hoc 1 Output: File loang.out, trong Gm mt dng duy nht cha s k cho bit s min 0 Loang.inp Loang.out 47 2 0010110 0011100 0000000 0000000
Const dx:array[1..4] of shortint=(-1,0,1,0); dy:array[1..4] of shortint=(0,-1,0,1); Procedure BFS(i,j:integer); {LOANG chieu rong} Begin Fillchar(d,sizeof(d),inf); Fillchar(p,sizeof(p),-1); color:=a; {To mau nhung dinh co gia tri 1} color[i,j]:=1; d[i,j]:=0; p[i,j]:=-1; head:=1; tail:=1; qx[head]:=i; qy[head]:=j; while (head<=tail) do Begin x:=qx[head]; y:=qy[head]; head:=head+1; For k:=1 to 4 do If a[x+dx[k],y+dy[k]]=0 then {Dinh ke, co gia tri 0} If color[x+dx[k],y+dy[k]]=0 then {Chua tham, white} Begin color[x+dx[k], y+dy[k]]:=1; {Da tham, gray} d[x+dx[k], y+dy[k]]:= d[x, y]+1; {Khoang cach} p[x+dx[k], y+dy[k]]:=k; {Luu dau cha} tail:=tail+1; qx[tail]:= x+dx[k]; qy[tail]:= y+dy[k]; End Else {nh k c gi tr 1} color[x+dx[k], y+dy[k]]:=1; color[x,y]:=2; {Ket thuc, black}

End;

End;

{---------------------------------------------CI TIN-------------------------------------}
Procedure BFS(i,j:integer); Begin Fillchar(color,sizeof(color),0); Fillchar(d,sizeof(d),inf); Fillchar(p,sizeof(p),-1); color:=a; {To mau nhung dinh co gia tri 1} color[i,j]:=1; d[i,j]:=0; p[i,j]:=-1; head:=1; tail:=1; qx[head]:=i; qy[head]:=j; while (head<=tail) do Begin For k:=1 to 4 do If a[qx[head]+dx[k],qy[head]+dy[k]]=0 then {Dinh ke, co gia tri 0} If color[qx[head]+dx[k],qy[head]+dy[k]]=0 then Begin color[qx[head]+dx[k], qy[head]+dy[k]]:=1; d[qx[head]+dx[k], qy[head]+dy[k]]:= d[qx[head], qy[head]]+1; p[qx[head]+dx[k], qy[head]+dy[k]]:=k; {Luu dau cha} tail:=tail+1; qx[tail]:= qx[head]+dx[k]; qy[tail]:= qy[head]+dy[k]; End; color[qx[head],qy[head]]:=2; {Ket thuc, black} head:=head+1; End; End;

TM NG I T S N V Procedure PRINT_PATH(x1,y1, x2, y2:integer); Var k:integer; Begin If (x1=y1) AND (x2=y2) then Writeln(x1,y1) Else If p[x1,y1]=-1 then Begin Writeln(no path); Exit; End Else Begin k:= p[qx[head]+dx[k], qy[head]+dy[k]]; PRINT_PATH(x1, y1, x2-k, y2-k);

Writeln(x2-k, y2-k); End; End; DFS Const dx:array[1..4] of shortint=(-1,0,1,0); dy:array[1..4] of shortint=(0,-1,0,1); Procedure MainDFS; Begin Fillchar(color, sizeof(color),0); Fillchar(p, sizeof(p),-1); time:=0; For i:=1 to m do For j:=1 to n do If color[i,j]=0 then DFS(i,j); End; Procedure DFS(i,j:integer); {LOANG theo chieu sau} Var k:integer; Begin color[i,j]:=1; {da tham, gray} S:=S+1; {time:=time+1; d[i,j]:=time;} For k:=1 to 4 do {Xet cac dinh} if a[i+dx[k],j+dy[k]]=0 then {ke voi (i,j), co gia tri 0} if color[i+dx[k],j+dy[k]]=0 then {chua tham, white} Begin color[i+dx[k],j+dy[k]]:=1; {da tham, gray} p[i+dx[k],j+dy[k]]:=k; {luu parent} DFS(i+dx[k],j+dy[k]); End; color[i,j]:=2; {ket thuc, black} {time:=time+1; f[i,j]:=time;} End; Procedure MainDFS; Var i,j:integer; temp:integer; Begin Assign(fo, fileout); Rewrite(fo); For i:=1 to maxR do

For j:=1 to maxC do p[i,j]:=-1; color:=a; {To mau truoc cac dinh co gia tri 1} dem:=0; For i:=1 to maxR do For j:=1 to maxC do if (color[i,j]=0) then {chua tham, white} Begin dem:=dem+1; DFS(i,j); End; Writeln(fo,dem); {Dem so MIEN LIEN THONG} End;

You might also like