hdu Oil Deposits

Oil Deposits

http://acm.hdu.edu.cn/showproblem.php?pid=1241

寻找石油,找有几片的油田。 经典的广度搜索。

亮点

{  

1.map的使用,空间 + 时间双丰收。  

2.使用了转化,把字符 变成 数字。当然对这一题来说是没有什么必要~  

3.在使用栈的时候,进入的顺序是 x y 出的时候是 y x,这个考虑到了。  

}

Ok~

#include<stdio.h>

#include<string.h>

char c[102][102];

int  a[102][102],f[102][102],zhan[402],f1;

int map[8][2]={{1,0},{1,1},{1,-1},{-1,1},{-1,-1},{-1,0},{0,1},{0,-1}};

void bfs(int x,int y,int n,int m)

{

    int i,x1,y1;

    zhan[++f1]=x;

    zhan[++f1]=y;

    while(f1>0)

    {

        y=zhan[f1--];

        x=zhan[f1--];

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

        {

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

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

            if(x1>=1&&x1<=n&&y1>=1&&y1<=m)

                if(a[x1][y1]==1&&f[x1][y1]==0)

                {

                    f[x1][y1]=1;

                    zhan[++f1]=x1;

                    zhan[++f1]=y1;

                }

        }

    }

}

int main()

{

    int i,j,n,m,num;

    while(scanf("%d",&m)>0&&m)

    {

        scanf("%d",&n);

        for(i=1;i<=m;i++)

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

        for(i=1;i<=100;i++)

            zhan[i]=0;f1=0;num=0;

        for(i=1;i<=m;i++)

            for(j=1;j<=n;j++)

            {

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

                    a[i][j]=0;

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

                    a[i][j]=1;

                f[i][j]=0;

            }

        for(i=1;i<=m;i++)

            for(j=1;j<=n;j++)

            {

                if(a[i][j]==1&&f[i][j]==0)

                {

                    num++;

                    bfs(i,j,m,n);

                }

            }

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

    }

    return 0;

}

 

你可能感兴趣的:(HDU)