输入可能有多个矩形区域(即可能有多组测试)。每个矩形区域的起始行包含m和n,表示行和列的数量,1<=n,m<=100,如果m =0表示输入的结束,接下来是n行,每行m个字符。每个字符对应一个小方格,并且要么是'*',代表没有油,要么是'@',表示有油
对于每一个矩形区域,输出油藏的数量。两个小方格是相邻的,当且仅当他们水平或者垂直或者对角线相邻(即8个方向)。
#include<cstdio> #include<iostream> #include<cstring> #define max 100+5水平或者垂直或者对角线相邻(即8个方向) using namespace std; int n,m,idx[max][max]; char a[max][max]; void dfs(int r,int c,int id) { if(r<0||r>=n||c<0||c>=m)//判断是否在油田内 return; if(idx[r][c]>0||a[r][c]!='@')//判断是否被访问过或是否为油田 return; idx[r][c]=id; //将被访问过的油田做上标记 for(int dr=-1;dr<=1;dr++) //检查该点水平或者垂直或者对角线相邻(即8个方向)有无油田并做上标记 for(int dc=-1;dc<=1;dc++) if(dr!=0||dc!=0) //本身不需要检查 dfs(r+dr,c+dc,id); //持续调用,当无油田时返回,最终将相连的一块做上标记,并返回,sum++; } int main() { while(cin>>n>>m) { if(n==0||m==0) break; else { int sum=0; memset(idx,0,sizeof(idx)); for(int i=0;i<n;i++) for(int j=0;j<m;j++) cin>>a[i][j]; for(int i=0;i<n;i++) for(int j=0;j<m;j++) if(idx[i][j]==0&&a[i][j]=='@') dfs(i,j,++sum); cout<<sum<<endl; } } }