zoukankan      html  css  js  c++  java
  • zoj 2412 dfs 求连通分量的个数

    题目来源: http://acm.zju.edu.cn/onlinejudge/showRuns.do?contestId=1

    求连通分量的个数:

    搜索时从第一个字符(对应一个正方形)开始,每搜索到一个正方形,对该位置的四个可能方向进行下一步搜索,下一步搜索需要满足的条件是 当前这个正方形有某个方向的搜索方向且下一个正方形也有这个方向的接受(连接)方向,故可进行一步搜索。例如 当前的可走的某个方向为“上”,则下一个正方形的连接方向应该为“下”,同理。上 --下,右-- 左,  下--上,  左---右。 往前走一步,要将当前正方形设置为已访问,表示当前搜索过程不能回到经过的正方形。 一旦前进不了,要回退,回到上一步的情形。

    代码如下:

     1 #include<iostream>
     2 #include<stdio.h>
     3 #include<string>
     4 #include<string.h>
     5 #define N 55
     6 using namespace std;
     7 char map[N][N];
     8 int flag[N][N];
     9 int m,n;
    10 int dir[4][2]={{-1,0},{0,1},{1,0},{0,-1}} ;  // 方向是上右下左的顺时针
    11 // tube1 可走的方向
    12 // tube2  可被选的方向,
    13 //搜索需满足这个正方形可以走的方向,且下一个正方形在该方向可被走(连接),故可搜索下一个正方形
    14 
    15 int tube1[11][4]={{1,0,0,1},{1,1,0,0},{0,0,1,1},{0,1,1,0},{1,0,1,0},{0,1,0,1},{1,1,0,1},{1,0,1,1},{0,1,1,1},{1,1,1,0},{1,1,1,1}};
    16 int tube2[11][4]={{0,1,1,0},{0,0,1,1},{1,1,0,0},{1,0,0,1},{1,0,1,0},{0,1,0,1},{0,1,1,1},{1,1,1,0},{1,1,0,1},{1,0,1,1},{1,1,1,1}};
    17 void dfs(int x,int y)
    18 {
    19     int i,xx,yy;
    20     if(flag[x][y] ) return ;   //???????要return
    21     flag[x][y]= 1;
    22     for(i=0;i<4;i++)
    23     {
    24         if(tube1[map[x][y]-'A'][i])
    25         {
    26             xx=x+dir[i][0];
    27             yy=y+dir[i][1];
    28             if(xx<0 || xx>m || yy<0 || yy>n) continue;
    29             if(tube2[map[xx][yy]-'A'][i])
    30                 dfs(xx,yy);
    31         }
    32     }
    33 }
    34 int main()
    35 {
    36    while(cin>>m>>n &&m>=0 &&n>=0)
    37    {
    38         int i,j,count;
    39         count= 0;
    40         for(i=0;i<m;i++)
    41         {
    42             for(j=0;j<n;j++)
    43             {
    44                 cin>>map[i][j];
    45                 flag[i][j]=0;
    46             }
    47         }
    48         for(i=0;i<m;i++)
    49         {
    50             for(j=0;j<n;j++)
    51             {
    52                 if(flag[i][j] == 0)
    53                 {
    54                     dfs(i,j);
    55                     count++;
    56                 }
    57             }
    58         }
    59         cout<<count<<endl;
    60 
    61    }
    62     return 0 ;
    63 }
  • 相关阅读:
    Python 容器用法整理
    C/C++中浮点数格式学习——以IEEE75432位单精度为例
    关于C/C++中的位运算技巧
    [GeekBand] C++11~14
    [GeekBand] 探讨C++新标准之新语法——C++ 11~14
    [GeekBand] 面向对象的设计模式(C++)(2)
    [GeekBand] 面向对象的设计模式(C++)(1)
    [GeekBand] STL与泛型编程(3)
    [GeekBand] STL与泛型编程(2)
    [GeekBand] STL与泛型编程(1)
  • 原文地址:https://www.cnblogs.com/zn505119020/p/3573799.html
Copyright © 2011-2022 走看看