是個遞迴,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;}