zoukankan      html  css  js  c++  java
  • UVa 572 Oil Deposits

      给一个m*n的矩阵,数字是0或是1,统计其中八连块的个数,和《算法竞赛入门经典》6.4.1黑白图像一样,应该是那个的原型吧。

      代码如下:

    View Code
     1 #include <cstdio>
     2 #include <cstring>
     3 
     4 const int maxn = 105;
     5 int mat[maxn][maxn], vis[maxn][maxn];
     6 
     7 void dfs(int x, int y)
     8 {
     9     if(vis[x][y] || !mat[x][y])   return;
    10     vis[x][y] = 1;
    11     dfs(x-1, y-1);   dfs(x-1, y);   dfs(x-1, y+1);
    12     dfs(x, y-1);                    dfs(x, y+1);
    13     dfs(x+1, y-1);   dfs(x+1, y);   dfs(x+1, y+1);
    14 }
    15 
    16 int main()
    17 {
    18 #ifdef LOCAL
    19     freopen("in", "r", stdin);
    20 #endif
    21     int m, n;
    22     while(scanf("%d%d", &m , &n) != EOF && m)
    23     {
    24         char s[maxn];
    25         memset(mat, 0, sizeof(mat));
    26         memset(vis, 0, sizeof(vis));
    27         for(int i = 0; i < m; i++)
    28         {
    29             scanf("%s", s);
    30             for(int j = 0; j < n; j++)
    31             {
    32                 if(s[j] == '*')   mat[i+1][j+1] = 0;
    33                 else if(s[j] == '@')   mat[i+1][j+1] = 1;
    34             }
    35         }
    36         int cnt = 0;
    37         for(int i = 1; i <= m; i++)
    38             for(int j = 1; j <= n; j++)
    39                 if(!vis[i][j] && mat[i][j])
    40                 {
    41                     cnt++;
    42                     dfs(i, j);
    43                 }
    44         printf("%d\n", cnt);
    45     }
    46     return 0;
    47 }

       上面是用递归的方式实现的,也可用显式栈来代替递归,代码如下:

    View Code
     1 #include <cstdio>
     2 #include <cstring>
     3 #include <stack>
     4 using namespace std;
     5 
     6 const int maxn = 105;
     7 int mat[maxn][maxn], vis[maxn][maxn];
     8 int m, n;
     9 
    10 const int dir[][2] = { {1, 1}, {1, 0}, {1, -1}, {0, 1}, {0, -1}, {-1, 1}, {-1, 0}, {-1,-1} };
    11 
    12 struct Pos
    13 {
    14     int x, y;
    15 };
    16 
    17 void dfs(int x, int y)
    18 {
    19     stack<Pos> s;
    20     Pos t;
    21     t.x = x;
    22     t.y = y;
    23     s.push(t);
    24     while(!s.empty())
    25     {
    26         t = s.top();
    27         s.pop();
    28         int x = t.x, y = t.y;
    29         for(int i = 0; i < 8; i++)
    30         {
    31             int nx, ny;
    32             nx = x + dir[i][0];
    33             ny = y + dir[i][1];
    34             if(nx >= 0 && nx < m && ny >= 0 && ny < n)
    35                 if(mat[nx][ny] && !vis[nx][ny])
    36                 {
    37                     t.x = nx;
    38                     t.y = ny;
    39                     s.push(t);
    40                     vis[nx][ny] = 1;
    41                 }
    42         }
    43     }
    44 }
    45 
    46 
    47 int main()
    48 {
    49 #ifdef LOCAL
    50     freopen("in", "r", stdin);
    51 #endif
    52     while(scanf("%d%d", &m, &n) != EOF && m)
    53     {
    54         char s[maxn];
    55         memset(mat, 0, sizeof(mat));
    56         memset(vis, 0, sizeof(vis));
    57         for(int i = 0; i < m; i++)
    58         {
    59             scanf("%s", s);
    60             for(int j = 0; j < n; j++)
    61                 if(s[j] == '@')   mat[i][j] = 1;
    62         }
    63         int cnt = 0;
    64         for(int i = 0; i < m; i++)
    65             for(int j = 0; j < n; j++)
    66                 if(!vis[i][j] && mat[i][j])
    67                 {
    68                     cnt++;
    69                     dfs(i, j);
    70                 }
    71         printf("%d\n", cnt);
    72     }
    73     return 0;
    74 }
  • 相关阅读:
    Delphi从Internet下载文件
    datasnap 上传/下载大文件(本Demo以图传片文件为例)
    delphi 理解ParamStr
    delphi2010多线程编程教程
    QQ2008自动聊天精灵delphi源码
    Delphi使用Indy、ICS组件读取网页
    UniDac 使用日记(转)
    delphi xe5 安卓 配置sqlite
    Netty内存管理器ByteBufAllocator及内存分配
    初识内存分配ByteBuf
  • 原文地址:https://www.cnblogs.com/xiaobaibuhei/p/3042676.html
Copyright © 2011-2022 走看看