dfs与bfs初步理解

题目描述

一矩形阵列由数字0到9组成,数字1到9代表细胞,细胞的定义为沿细胞数字上下左右若还是细胞数字则为同一细胞,求给定矩形阵列的细胞个数。(1<=m,n<=100)?

输入输出格式

输入格式:

输入:整数m,n(m行,n列)矩阵

输出格式:

输出:细胞的个数

输入输出样例

输入样例#1: 
4  10
0234500067
1034560500
2045600671
0000000089
输出样例#1: 
4







DFS(定义:在有向图的遍历中找出一个未被访问的顶点做为起始顶点,然后由当前顶点的边走到未访问的顶点;当没有未被访问的顶点时,则回到上一个顶点,继续试探访问别的顶点,直到所有顶点被访问过)

//DFS
#include <stdio.h>
#include<string.h>
#include <iostream>
using namespace std;
int n,m;
char a[106][106];
bool vis[106][106];
/*上下左右方法1
void dfs(int i,int j)
{
  vis[i][j]=true;
  //int h=a[i][j]-'1'+1;
  if(i+1<=n&&!vis[i+1][j]&&a[i+1][j]!='0') dfs(i+1,j);
  if(j+1<=m&&!vis[i][j+1]&&a[i][j+1]!='0')  dfs(i,j+1);
  if(i-1>=1&&!vis[i-1][j]&&a[i-1][j]!='0')  dfs(i-1,j);
  if(j-1>=1&&!vis[i][j-1]&&a[i][j-1]!='0') dfs(i,j-1);
}
*/
int xx[5]={0,1,0,-1,0};//注意0~4J就为{1,0,-1,0};
int yy[5]={0,0,1,0,-1};//
void dfs(int i,int j)
{
  for(int k=1;k<5;k++)
      if((i+xx[k]>=1)&&(i+xx[k]<=n)&&(j+yy[k]>=1)&&(j+yy[k]<=m)&&(a[i+xx[k]][j+yy[k]]!='0')&&(!vis[i+xx[k]][j+yy[k]]))
      {
          vis[i+xx[k]][j+yy[k]]=true;
          dfs(i+xx[k],j+yy[k]);
      }
}
int main()
{
    int sum;
    memset(vis,false,sizeof(vis));
  scanf("%d%d",&n,&m);
  for(int i=1;i<=n;i++)
     for(int j=1;j<=m;j++)
         cin>>a[i][j];
    sum=0;
   for(int i=1;i<=n;i++)
    for(int j=1;j<=m;j++)
      if(a[i][j]!='0'&&!vis[i][j])
      {
       sum++;
       vis[i][j]=true;
       dfs(i,j);
      }
   printf("%d",sum);
   return 0;
}

BFS(一层层的搜)

#include<stdio.h>
#include <string.h>
#include <queue>
#include <iostream>
using namespace std;
int n,m,tnt=0;
int xx[4]={1,0,-1,0};
int yy[4]={0,1,0-1};
bool a[106][106];
void bfs(int i,int j)
{
    queue<int>qx,qy;
    tnt++;
    int x,y;
    qx.push(i);
    qy.push(j);
    a[i][j]=false;
    while(!qx.empty())
    {
      for(int k=0;k<4;k++)
      {
         x=qx.front()+xx[k];
         y=qy.front()+yy[k];
         if(x>=1&&x<=n&&y>=1&&y<=m&&a[x][y])
         {
         qx.push(x);
         qy.push(y);
         a[x][y]=false;
         }
      }
      qx.pop(),qy.pop();
    }
}
int main ()
{
   string s;
   scanf("%d%d",&n,&m);
   for(int i=1;i<=n;i++)
   {
      cin>>s;
      for(int j=0;j<m;j++)//注意s起始是从0开始的
       if(s[j]=='0') a[i][j+1]=false;
       else a[i][j+1]=true;
   }
   for(int i=1;i<=n;i++)
      for(int j=1;j<=m;j++)
        if(a[i][j])
           bfs(i,j);
   printf("%d",tnt);
   return 0;
}

猜你喜欢

转载自blog.csdn.net/honeycomb_1/article/details/79947355