不是VIP会员,不能显示答案

题目解答

题目:
(统计数字群个数) 某矩阵由数字0到9组成,其中0表示隔板(无法通过),数字1到9表示可以通过。一个数字群为:从某个数字非0数字出发,沿着可通行数字所能到达的所有数字(行走方向可以是上下左右),这些相互能到达的数字即组成同一数字群。给出矩阵,统计该矩阵包含的数字群的个数。
输入数据第一行表示矩阵的行数m和列数n,接下来m行,每行有连续的n个字符,每个字符均为数字0到9。输出数据只有一个,即该矩阵中包含的数字群个数。

例如输入数据如下:
3 8
01234000
10030008
79000600
则输出数据如下:
4

请完善下面程序。
const maxm=50; maxn=80; 
var 
   m,n,i,j,k,tot:integer; 
   a:array[1..maxm,1..maxn] of 0..1; 
   b:array[1..4000,1..2] of integer; 
   st:string; 
 
procedure bfs(p,q:integer); 
var x,y,f,t:integer; 
begin 
   f:=1;t:=1; 
   b[t,1]:=p;b[t,2]:=q; 
   a[p,q]:=0; 
   inc(t); 
   repeat 
      for k:=1 to 4 do begin 
         if k=1 then begin x:=p+1;y:=q; end; 
         if k=2 then begin x:=p;y:=q+1; end; 
         if k=3 then begin x:=p-1;y:=q; end; 
         if k=4 then begin x:=p;y:=q-1; end; 
         if (x>0) and (x<=m) and (y>0) and (y<=n) and (a[x,y]=1) then begin 
            b[t,1]:=x; 
            b[t,2]:=y; 
                   a[x,y]:=0;        
            inc(t); 
         end; 
      end; 
            inc(f)       ; 
      p:=b[f,1];q:=b[f,2]; 
          f>t       ; 
end; 
 
begin 
   readln(m,n); 
   fillchar(a,sizeof(a),0); 
   for i:=1 to m do begin 
      readln(st); 
      for j:=1 to n do 
         if       st[j]<>'0'      then a[i,j]:=1 
   end; 
   tot:=0; 
   for i:=1 to m do 
      for j:=1 to n do 
         if          a[i,j]=1        then begin 
            bfs(i,j); 
                    inc(tot)      ; 
         end; 
   writeln(tot); 
end. 
考点:
分析:
解答:
评论:
老师: