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;
}

 

posted @ 2013-05-12 23:07  芷水  阅读(153)  评论(0编辑  收藏  举报