输入一个m行n列的字符矩阵,统计字符“@”组成多少个八连块。如果两个字符“@”所在的格子相邻,(横、竖或者对角线方向),就说他们属于一个八连块。例如:
* * * * @
* @@ *@
* @ * *@
@@@ *@
@@ * *@
这个矩阵就有两个八连块。
分析:从每个“@”格子出发,递归遍历它周围的“@”格子,每访问一次就做好标记它已经被访问过了。
C语言代码:
#include <stdio.h>
#include <stdlib.h>
int ok[5][5];//用来标记是否遍历过
char map[5][5];
int count=0;//用来记录油田个数
int p=0;
int n,m;
void DFS(int i,int j)
{
if(p==0&&ok[i][j]==0&&map[i][j]=='@')
{
count++;
p=1;
}
if(i<0||i>=m||j<0||j>=n||ok[i][j]==1||map[i][j]=='*')//如果越界或者该点访问过或者不是@就return
return;
if(map[i][j]=='@'&&ok[i][j]==0) //如果是油田并且没被访问过就标记该点已访问过
ok[i][j]=1;
/*遍历每个点*/
DFS(i,j+1);
DFS(i,j-1);
DFS(i+1,j);
DFS(i+1,j);
DFS(i+1,j+1);
DFS(i+1,j-1);
DFS(i-1,j+1);
DFS(i-1,j-1);
}
int main()
{
int i,j;
while(scanf("%d%d",&m,&n)!=EOF)
{
count=0;
for(i=0;i<5;i++)
for(j=0;j<5;j++)
ok[i][j]=0;
for(i=0;i<5;i++)
for(j=0;j<5;j++)
map[i][j]='*';
if(m==0&&n==0)
break;
getchar();
for(i=0;i<m;i++)
gets(map[i]);
for(i=0;i<m;i++)
for(j=0;j<n;j++)
{
DFS(i,j);
p=0;
}
printf("%d\n",count);
}
return 0;
}