P1451 求细胞数量 题解

· · 题解

这是一道用DFS求联通块的题解

本人被坑了10余次

现奉上代码:


#include<bits/stdc++.h>//万能头
using namespace std;
int ma[105][105];//地图数组
int m,n,coun=0;
int dx[4]={0,0,1,-1};//四方向数组
int dy[4]={1,-1,0,0};//四方向数组
void dfs(int x,int y){//重点函数
    ma[x][y]=0;//标记为没有
    for(int i=0;i<4;i++){//记住是小于4而不是小于等于4啊
        x+=dx[i];y+=dy[i];//变换坐标
        if(x>0&&x<=n&&y>0&&y<=m&&ma[x][y]!=0)//如果不越界且大于0
        {
            dfs(x,y);、、继续搜索
        }
        x-=dx[i];y-=dy[i];//回溯一步
    }
}
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
    {
       for(int j=1;j<=m;j++)
       {
        scanf("%1d",&ma[i][j]);//每个变量只输入一位
       }
    }
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            if(ma[i][j]==0)//如果为0
            {
                continue;//返回
            }
            dfs(i,j); //搜索
            coun++;//计数
        }
    }
    cout<<coun;//输出
    return 0;
 } 

 这里还有两个普通的深搜模板
深度优先搜索算法框架1
int Search(int k)
 {
 for (i=1;i<=算符种数;i++)
  if (满足条件)
     {
    保存结果
    if (到目的地) 输出解;
              else Search(k+1);
    恢复:保存结果之前的状态{回溯一步}
     }
 }
 深度优先搜索算法框架2
int Search(int k)
 {
   if  (到目的地) 输出解;
   else
    for (i=1;i<=算符种数;i++)
     if  (满足条件) 
       {
        保存结果;
                     Search(k+1)
                             恢复:保存结果之前的状态{回溯一步}
       }
 }

做完这道题后,大家也可以做一下P1506 P1596 都是DFS求联通块的题目,用来提升自己的编程水平

最后,希望大家能学会DFS,也希望管理大大能通过此篇题解!