题目来源:http://poj.org/problem?id=3051
直接广度搜索 水~ 练手
#include <iostream>
#include <string>
#include <cstdio>
using namespace std;
typedef struct
{
int i;
int j;
}point;
point P[80010];
int W,H;
char a[1010][90];
int bfs(int i,int j)
{
a[i][j]='.';
P[0].i=i;P[0].j=j;
int l=-1,r=0;
while(l!=r)
{
l++;
if(a[P[l].i][P[l].j+1]=='*')
{
r++;
P[r].i=P[l].i;P[r].j=P[l].j+1;
a[P[r].i][P[r].j]='.';
}
if(a[P[l].i][P[l].j-1]=='*')
{
r++;
P[r].i=P[l].i;P[r].j=P[l].j-1;
a[P[r].i][P[r].j]='.';
}
if(a[P[l].i+1][P[l].j]=='*')
{
r++;
P[r].i=P[l].i+1;P[r].j=P[l].j;
a[P[r].i][P[r].j]='.';
}
if(a[P[l].i-1][P[l].j]=='*')
{
r++;
P[r].i=P[l].i-1;P[r].j=P[l].j;
a[P[r].i][P[r].j]='.';
}
}
return r+1;
}
int main()
{
while(~scanf("%d%d",&W,&H))
{
int ans=0;
for(int i=0; i<=H+1; i++)
for(int j=0; j<=W+1; j++)
a[i][j]='.';
for(int i=1; i<=H; i++)
{
scanf("%s",a[i]+1);
a[i][W+1]='.';
}
for(int i=1; i<=H; i++)
{
for(int j=1; j<=W; j++)
{
if(a[i][j]=='*')
{
int sum=bfs(i,j);
if(ans<sum) ans=sum;
}
}
}
printf("%d\n",ans);
}
}