dfs油田

来源:互联网 发布:uygurqa mp3 下载软件 编辑:程序博客网 时间:2024/05/17 07:08


输入可能有多个矩形区域(即可能有多组测试)。每个矩形区域的起始行包含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;        }    }}


0 0
原创粉丝点击