UVA 572 Oil Deposits(DFS)

来源:互联网 发布:小蜜蜂软件 编辑:程序博客网 时间:2024/05/18 06:26

题目链接

题意

给出一个m行n列的矩阵,@字符表示油田,油田可以八连通,询问一共有几个八连块

解决

  1. 我想说对于两个月前(2017.07)的我,我也是连这种简单的DFS都不会的人(⊙o⊙)…
  2. 经过暑期集训会的东西多了好多好多,如果让我一个人学…怕是要完^_^
  3. 解决就是DFS深搜一下
  4. 遍历每一个是’@’的点,让ans+1
  5. 具体可以看下注释^_^
#include<bits/stdc++.h>using namespace std;int m,n;char maps[105][105];void dfs(int i,int j){    maps[i][j]='*';                 //把@字符变成普通字符,要不搜索过程中可能会回退回来,变成无限循环。。。    int di,dj,ni,nj;    for(int di=-1;di<=1;di++)    {        for(int dj=-1;dj<=1;dj++)   //有的人喜欢用数组表示移动的方向,我喜欢这样子表示^_^        {            ni=i+di;nj=j+dj;        //如果是只能向四个方向移动,可以加一句if(di*dj!=0) continue;            if(ni<0||nj<0||ni>m||nj>n) continue;    //坐标合法性            //if(di*dj!=0) continue;            if(maps[ni][nj]=='@')                dfs(ni,nj);         //接续搜索下一个位置        }    }}int main(){    while(1)    {        int ans=0;        scanf("%d%d",&m,&n);        if(!m||!n) break;        getchar();        for(int i=0;i<m;i++) scanf("%s",maps[i]);        for(int i=0;i<m;i++)        {            for(int j=0;j<n;j++)            {                if(maps[i][j]=='@')                {                    dfs(i,j);                               ans++;              //扫描到一个@之后,dfs函数会把与它相连的所有@都清空掉,所以每次便利到@都让ans+1                }            }        }        cout<<ans<<endl;    }}
原创粉丝点击