改过的程序,但是只有30??而且本地测试和测试数据上面答案一样???
```cpp
#include <stdio.h>
#include <string.h>
int que[100001][2],a[101][101],b[101][101],n,m;
int qw[4][2]={{-1,0},{1,0},{0,-1},{0,1}};
void bfs(int x,int y)
{
//printf("^^%d %d^^\n",x,y);
int tail=1,head=0;
b[x][y]=0;
que[1][0]=x;
que[1][1]=y;
do
{
head++;
for (int i=0;i<4;i++)
{
int x1=que[head][0]+qw[i][0];
int y1=que[head][1]+qw[i][1];
//printf("%d %d %d %d %d %d %d %d %d %d\n",x1,y1,b[x1][y1],a[x1][y1],x1>=1,x1<=n,y1>=1,y1<=m,a[x1][y1]>=1,n);
if (b[x1][y1]==1 && x1>=1 && x1<=n && y1>=1 && y1<=m && a[x1][y1]>=1)
{
tail++;
// printf("##%d %d###\n",x1,y1);
que[tail][0]=x1;
que[tail][1]=y1;
b[x1][y1]=0;
}
// head++;
}
}while (head<tail);
}
int main()
{
int ans=0;
char ch,ch1;
scanf("%d%d",&n,&m);
scanf("%c",&ch);
for (int i=0;i<=n+1;i++)
{
for (int j=0;j<=m+1;j++)
{
b[i][j]=1;
}
}
for (int i=1;i<=n;i++)
{
for (int j=1;j<=m+1;j++)
{
scanf("%c",&ch);
a[i][j]=ch-'0';
}
}
for (int i=1;i<=n;i++)
{
for (int j=1;j<=m;j++)
{
if (a[i][j]>=1 && a[i][j]<=9 && b[i][j]==1)
{
//printf("%d %d\n",i,j) ;
bfs(i,j);
ans++;
}
}
}
printf("%d\n",ans);
return 0;
}
```
by Sakura_Peng @ 2017-10-10 23:38:02
其实这道题是可以用灌水法做的
by origin_star @ 2018-04-08 21:02:24
```pascal
var a:array[1..1000,1..1000]of shortint;
vis:array[1..1000,1..1000]of boolean;
n,m,i,j,ans:longint;
dx:array[1..4]of longint=(1,0,-1,0);
dy:array[1..4]of longint=(0,1,0,-1);
ch:char;
procedure dfs(x,y:longint);
var i:longint;
begin
if (x<1)or(x>n)or(y<1)or(y>m) then exit;
if (vis[x,y])or(a[x,y]=0) then exit;
vis[x,y]:=true;
for i:=1 to 4 do
dfs(x+dx[i],y+dy[i]);
end;
begin
fillchar(vis,sizeof(vis),false);
readln(n,m);
for i:=1 to n do
begin
for j:=1 to m do
begin
read(ch);
a[i,j]:=ord(ch)-48;
end;
readln;
end;
for i:=1 to n do
for j:=1 to m do
if (a[i,j]<>0)and(not vis[i,j]) then
begin
dfs(i,j);
inc(ans);
end;
writeln(ans);
end.
```
贴上代码
by origin_star @ 2018-04-08 21:08:02
看不懂的话,可以让人翻译一下
by origin_star @ 2018-04-08 21:08:34