问题
输入一个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);
}