hdu 1241 dfs求连通分量个数

来源:互联网 发布:adobe cc 2018mac破解 编辑:程序博客网 时间:2024/06/11 18:43

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

题意:求连通分量的个数,8个方向。

做过好几次了,表示对dfs,bfs真没感觉。嗨。哭死。。。

View Code
// I'm lanjiangzhou//C#include <stdio.h>#include <stdlib.h>#include <string.h>#include <ctype.h>#include <math.h>#include <time.h>//C++#include <iostream>#include <algorithm>#include <cstdio>#include <cstdlib>#include <cmath>#include <cstring>#include <cctype>#include <stack>#include <string>#include <list>#include <queue>#include <map>#include <vector>#include <deque>#include <set>using namespace std;//*************************OUTPUT*************************#ifdef WIN32#define INT64 "%I64d"#define UINT64 "%I64u"#else#define INT64 "%lld"#define UINT64 "%llu"#endif//**************************CONSTANT***********************#define INF 0x3f3f3f3f// aply for the memory of the stack//#pragma comment (linker, "/STACK:1024000000,1024000000")//endconst int maxn =1010;int n,m;int dir[8][2]={{-1,-1},{-1,0},{-1,1},{0,-1},{0,1},{1,-1},{1,0},{1,1}};int dis[maxn][maxn];char maps[maxn][maxn];int sum;int vis[maxn][maxn];void dfs(int start,int end){    //vis[start][end]=1;    //int x=start+dir[]    maps[start][end]='*';    for(int i=0;i<8;i++){        int x=dir[i][0]+start;        int y=dir[i][1]+end;        if(x<0||x>=n||y<0||y>=m) continue;        if(maps[x][y]=='@'){            dfs(x,y);        }    }}int main(){    while(scanf("%d%d",&n,&m)!=EOF){        if(n==0&&m==0) break;       // memset(vis,0,sizeof(vis));        getchar();        for(int i=0;i<n;i++){            scanf("%s",maps[i]);            //for(int j=0;j<m;j++){               // if(maps[i][j]=='@'){                  //  dis[i][j]=1;                //}                //else dis[i][j]=0;           // }        }        sum=0;        for(int i=0;i<n;i++){            for(int j=0;j<m;j++){                if(maps[i][j]=='@'){                    dfs(i,j);                    sum++;                }            }        }        printf("%d\n",sum);    }    return 0;}