zoukankan      html  css  js  c++  java
  • hdu 1241 dfs求连通分量个数

    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")
    //end
    
    const 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;
    }
  • 相关阅读:
    MFC常见问题解惑
    VS2010之MFC串口通信的编写教程
    Visual C++ 开发心得与调试技巧
    WIN32 DLL中使用MFC
    c++ 类模版、成员函数模版、函数模版 用法
    【学术篇】浅谈各种邻接表
    【模板篇】树状数组们(四)
    【学术篇】网络流24题--飞行员配对方案问题
    【学术篇】网络流24题--骑士共存问题
    【模板篇】树状数组们(三)
  • 原文地址:https://www.cnblogs.com/lanjiangzhou/p/3007231.html
Copyright © 2011-2022 走看看