ACM油田问题

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






猜你喜欢

转载自blog.csdn.net/a1291985595/article/details/54667617