非常简单的DFS,初学DFS做这道题很合适。需要注意的是题目中输入的行和列顺序是颠倒的。
1 #include<cstdio> 2 #include<cstring> 3 using namespace std; 4 int m,n,cnt,dir[4][2]={{0,1},{0,-1},{-1,0},{1,0}}; 5 char a[22][22]; 6 void dfs(int si,int sj) 7 { 8 a[si][sj]='#'; 9 cnt++; 10 int sx,sy; 11 for(int i=0;i<4;i++) 12 { 13 sx=si+dir[i][0]; 14 sy=sj+dir[i][1]; 15 if(sx<0||sx>=m||sy<0||sy>=n||a[sx][sy]=='#') 16 continue; 17 else 18 dfs(sx,sy); 19 } 20 } 21 int main() 22 { 23 while(scanf("%d%d",&n,&m)) 24 { 25 if(m==0&&n==0) 26 break; 27 int si,sj,i,j; 28 cnt=0; 29 for(i=0;i<m;i++) 30 scanf("%s",a[i]); 31 for(i=0;i<m;i++) 32 for(j=0;j<n;j++) 33 if(a[i][j]=='@') 34 { 35 si=i;sj=j; 36 } 37 dfs(si,sj); 38 printf("%d ",cnt); 39 } 40 return 0; 41 }