题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1241
/* 遍历所有点,找到未被标记的‘@’,num++,标记该节点,对该点进行dfs, 找到相邻的'@',标记该节点,再次进入dfs, 直到各个方向都不存在相邻未被标记的'@'后退出,继续进行遍历 */ #include<iostream> using namespace std; int m,n; char grid[101][101]; int visited[101][101]; int dir[8][2]={{1,0},{1,1},{1,-1},{-1,0},{0,1},{0,-1},{-1,-1},{-1,1}}; int num; //num为deposit的数量 int fr,fc; void dfs(int r,int c){ for(int i=0;i<8;i++) { fr=r+dir[i][0]; fc=c+dir[i][1]; if(fr>=m||fr<0) continue; if(fc>=n||fc<0) continue; if(grid[fr][fc]=='*') continue; if(visited[fr][fc]) continue; visited[fr][fc]=1; dfs(fr,fc); } } int main (){ while(cin>>m>>n) { if(!m) break; for(int i=0;i<m;i++) cin>>grid[i]; num=0; memset(visited,0,sizeof(visited)); for(int i=0;i<m;i++) { for(int j=0;grid[i][j]!='