HDU_1241 Oil Deposits(dfs)

来源:互联网 发布:网络赛车赌博是骗局吗 编辑:程序博客网 时间:2024/04/27 21:18

题目来源:http://acm.hdu.edu.cn/showproblem.php?pid=1241


题目大意:==》其实就是给你一个图形,问有多少块含‘@’连通(连通包括在同一行、列或对角线)


分八个方向来搜索,我写的时候因为粗细遇到了一些问题,但是自己可以尝试输出中间量来debug==


源代码:

#include<iostream>#include<cstdlib>#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>#include<queue>using namespace std;int m;//记录大小int n;const int maxn = 100+5;//最大大小char mymap[maxn][maxn];//记录形状int visited[maxn][maxn];//记录有没有被访问过int dir[8][2] = { {-1,-1}, {-1,0}, {-1,1}, {0,1}, {1,1}, {1,0}, {1,-1}, {0,-1}};//定义方向向量记录八个方向//判断所处位置是否在给定形状里面( 是否合法)bool check( int x, int y){    if( x >= 0 && x < m && y >= 0 && y < n)        return true;    return false;}void dfs( int x, int y, int ans){    int dx;    int dy;    for( int i = 0; i < 8; i++)//以当前位置展开八个方向的搜索    {        dx = x+dir[i][0];        dy = y+dir[i][1];        if( check( dx,dy) && mymap[dx][dy] == '@' && visited[dx][dy] == 0)//        {            visited[dx][dy] = ans;            dfs( dx,dy,ans);        }    }}int main(){    while( scanf("%d%d",&m,&n) == 2 && m && n)    {        for( int i = 0; i < m; i++)            scanf("%s",mymap[i]);//输入形状        int ans = 0;//初始化answer        memset(visited,0,sizeof(visited));        for( int i = 0; i < m; i++)        {            for( int j = 0; j < n; j++)            {                //存在且未被访问过                if( mymap[i][j] == '@' && visited[i][j] == 0)                {                    ans++;                    visited[i][j] = ans;                    dfs( i,j,ans);                }            }        }        printf("%d\n",ans);    }    return 0;}


0 0