Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2862412
  • 博文数量: 471
  • 博客积分: 7081
  • 博客等级: 少将
  • 技术积分: 5369
  • 用 户 组: 普通用户
  • 注册时间: 2012-01-04 21:55
文章分类

全部博文(471)

文章存档

2014年(90)

2013年(69)

2012年(312)

分类: C/C++

2012-04-10 20:37:41


比如:题目说的是在一个矩阵里,有些格子是矿井,有些不是,相邻(上、下、左、右、左上、右上、左下、右下)的格子如果也是矿井,那么他们属于同一个矿井,问总共有多少个矿井。很明显就是DFS。
1 1 * 3 5 *@*@* **@** *@*@* 1 8 @@****@* 5 5 ****@ *@@*@ *@**@ @@@*@ @@**@ 0 0
思路:
    DFS型。分别以每个点为起点扫描一次,判断连通分量个数即可。


  1. #include<stdio.h>
  2. /**
  3. ** 深度搜索一般用递归
  4. **/
  5. #define Maxn 150
  6. char s[Maxn][Maxn];//用二维数组存储图结构
  7. int move[8][2]={{1,0},{-1,0},{0,1},{0,-1},{1,1},{-1,1},{1,-1},{-1,-1}};//定义八个可行方向
  8. int m,n,k,ans;
  9. void dfs(int x,int y)
  10. {
  11.    int i;
  12.    for(i=0;i<8;i++)//依次扫描八个方向,寻找可行点
  13.    {
  14.       int tx=x+move[i][0];
  15.       int ty=y+move[i][1];
  16.       if(tx>=0&&tx<m&&ty>=0&&ty<n&&s[tx][ty]=='@')//判断是否超出地图边界和是否可行
  17.       {
  18.          s[tx][ty]='*';//标记已经走过的点
  19.          dfs(tx,ty);//以此点为起点继续深入搜索,这就是深度优先搜索
  20.       }
  21.    }
  22. }
  23. int main()
  24. {
  25.    int i,j;
  26.    while(scanf("%d%d",&m,&n))
  27.    {
  28.       ans=0;
  29.       if(m==0&&n==0) break;
  30.       for(i=0;i<m;i++)
  31.       {
  32.          scanf("%s",s[i]);
  33.       }
  34.       for(i=0;i<m;i++)//分别以每个点为起点扫描一次,判断连通分量个数即可。
  35.       {
  36.          for(j=0;j<n;j++)
  37.          {
  38.             if(s[i][j]=='@')//直接忽略没有油田的点
  39.             {
  40.                s[i][j]='*';//标记该点已经走过
  41.                ans++;
  42.                dfs(i,j);
  43.             }
  44.          }
  45.       }
  46.       printf("%d\n",ans);
  47.    }
  48.    return 0;
  49. }

阅读(3292) | 评论(0) | 转发(0) |
0

上一篇:深度优先搜索

下一篇:DFS经典题目

给主人留下些什么吧!~~