是个递归,dfs的题目,主要是判断是鸟的时候要判断其周围的点是'.'空气,一共判断18个点。
#include<cstring>
#include<cstdio>
using namespace std;
char map[35][35];
int h,w,vis[35][35];
void dfs(int x,int y)
{
if(!(map[x][y]=='|'||map[x][y]=='/'||map[x][y]=='\\'||map[x][y]=='-'||map[x][y]=='@')||vis[x][y])
return ;
vis[x][y]=1;
dfs(x+1,y);
dfs(x-1,y);
dfs(x,y+1);
dfs(x,y-1);
dfs(x+1,y+1);
dfs(x+1,y-1);
dfs(x-1,y+1);
dfs(x-1,y-1);
}
int main()
{
//freopen("in.txt","r",stdin);
int i,j,cas,flower,bird;
scanf("%d",&cas);
while(cas--)
{
scanf("%d%d",&h,&w);
getchar();
memset(map,'.',sizeof(map));
for(i=1; i<=h; i++)
{
for(j=1; j<=w; j++)
scanf("%c",&map[i][j]);
getchar();
}
/*for(i=1;i<=h;i++)
{
for(j=1;j<=w;j++)
printf("%c",map[i][j]);
putchar('\n');
}*/
memset(vis,0,sizeof(vis));
flower=0;
bird=0;
for(i=1; i<=w; i++)
{
if(!vis[h-1][i]&&(map[h-1][i]=='|'||map[h-1][i]=='/'||map[h-1][i]=='\\'||map[h-1][i]=='-'||map[h-1][i]=='@'))
{
//printf("tt\n");
dfs(h-1,i);
flower++;
}
}
for(i=1; i<=h; i++)
{
for(j=1; j<=w; j++)
{
if(!vis[i][j]&&map[i][j]=='/'&&map[i][j+1]=='\\'&&map[i][j+2]=='/'&&map[i][j+3]=='\\')
{
vis[i][j]=1;
if(map[i-1][j-1]=='.'&&map[i-1][j]=='.'&&map[i-1][j+1]=='.'&&map[i-1][j+2]=='.'&&map[i-1][j+3]=='.'&&map[i-1][j+4]=='.')
{
if(map[i][j-1]=='.'&&map[i][j+4]=='.')
{
if(map[i+1][j-1]=='.'&&map[i+1][j]=='.'&&map[i+1][j+1]=='.'&&map[i+1][j+2]=='.'&&map[i+1][j+3]=='.'&&map[i+1][j+4]=='.')
bird++;
}
}
}
}
}
printf("Flowers: %d\n",flower);
printf("Birds: %d\n",bird);
}
return 0;
}