DFS求连通块

问题

输入一个5行5列的矩阵,统计字符“@”构成多少个八连块。

例如输入:

****@
*@@*@
****@
@@@*@
@@**@

输出:

3

使用伪代码叙述思路:

Dfs(V) {
  if( V是旧点)
   return;
  将V标记为旧点;
  对和V相邻的每个点 U {
   Dfs(U);
  }
}
 
int main() 
{
  将所有点都标记为新点;
  while(在图中能找到新点k)
    Dfs(k);
 } 

DFS既可以用于寻找路径,也可以用于遍历图,两者在具体实现上有细微差别。对于本题,需要遍历所有节点,所以对每个邻接点U执行DFS后,不需要返回上层函数,而是继续执行下一个邻接点的DFS。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char a[5][5];
int id[5][5];

int dfs(int x, int y, int idx)
{
	if(x<0 || x>4 ||y<0||y>4 || a[x][y]=='*')
	{
		return 1;
	}
	if(id[x][y]!=-1)
	{
		return 0;
	}
	id[x][y]=idx;
	
	dfs(x-1, y-1,idx);
	dfs(x, y-1,idx);
	dfs(x+1, y-1,idx);
	dfs(x-1, y,idx);
	dfs(x+1, y,idx);
	dfs(x-1, y+1,idx);
	dfs(x, y+1,idx);
	dfs(x+1, y+1,idx);
}

int main()
{
	memset(id,-1,5*5*sizeof(int));
	int i=0, j=0;
	for(i=0;i<5;i++)
	{
		for(j=0;j<5;j++)
		{
			a[i][j] = getchar();
		}
		getchar();
	}
	
	int num=0;
	
	for(i=0;i<5;i++)
	{
		for(j=0;j<5;j++)
		{
			if(id[i][j]==-1 && a[i][j]=='@')
				dfs(i, j, ++num);
		}
	}
	
	for(i=0;i<5;i++)
	{
		for(j=0;j<5;j++)
		{
			printf("%d ", id[i][j]);
			//printf("%c ", a[i][j]);
		}
		printf("\n");
	}
	printf("%d", num);
}

猜你喜欢

转载自blog.csdn.net/qq_39072699/article/details/81409441
今日推荐