水题,简单的DFS #include <cstdio> using namespace std; const int MAX = 30; int row , col; char data[MAX][MAX]; int sum; bool getnext( int xx , int yy , int& newx , int & newy , int step ) { static int x[4] = {0,0,1,-1}; static int y[4] = {1,-1,0,0}; newx = xx + x[step]; newy = yy + y[step]; if( newx >= 0 && newx < row && newy >= 0 && newy < col && data[newx][newy] == '.') return true; else return false; } void find( int x , int y ) { int newx ,newy; data[x][y] = '#'; sum++; for( int i = 0 ; i != 4 ; ++i ) if( getnext( x , y , newx , newy , i ) ) find( newx , newy ); } int main() { while( scanf("%d%d",&col,&row) , row != 0 || col != 0 ) { for( int i = 0 ; i != row ; ++i ) scanf("%s",data[i]); for( int i = 0 ; i != row ; ++i ) { for( int j = 0 ; j != col ; ++j ) if( data[i][j] == '@' ) { sum = 0 ; find( i , j ); printf("%d/n",sum); break; } } } return 0; }