当前位置: 代码迷 >> 综合 >> uva572 Oil Deposits
  详细解决方案

uva572 Oil Deposits

热度:27   发布时间:2023-12-07 01:33:24.0

Oil Deposits

输入一个m行n列的字符矩阵,统计字符“@”组成多少个八连块。如果两个字符“@”所在的格子相邻(横、竖或者对角线方向),就说它们属于同一个八连块。

Sample Input

1 1 

3 5 
*@*@* 
**@** 
*@*@* 
1 8 
@@****@* 
5 5 
****@ 
*@@*@ 
*@**@ 
@@@*@ 
@@**@ 
0 0

Sample Output




2


#include<cstdio>

#include<cstring>

#include<algorithm>

#include<iostream>

using namespace std;

char c[108][108];

int a[8][2]={ {-1,0},{1,0},{0,-1},{0,1},{1,1},{-1,-1},{1,-1},{-1,1}}; //8个方向

int n,m;

bool go(int sx,int sy)

{

    if(0<=sx&&sx<n&&0<=sy&&sy<m&&c[sx][sy]=='@')//可以前进

        return true;

    return false;

}

void dfs(int x,int y)

{

    c[x][y]='*';

    int i,x1,y1;

    for(i=0;i<8;i++)

    {

        x1=x+a[i][0];

        y1=y+a[i][1];

        if(go(x1,y1))

        {

            dfs(x1,y1);

        }

    }

}

int main()

{

    while(scanf("%d%d",&n,&m)!=EOF)

    {

        if(n==0&&m==0)

            break;

        int i,j,ans=0;

        for(i=0;i<n;i++)

        {

            scanf("%s",c[i]);

        }

        for(i=0;i<n;i++)

        {

            for(j=0;j<m;j++)

            {

                if(c[i][j]=='@')

                {

                    dfs(i,j);

                    ans++;

                }

            }

        }

        printf("%d\n",ans);

    }

    return 0;

}