• nyoj 284 poj 2312 搜索之水池数目


     

    水池数目

    时间限制:3000 ms  |  内存限制:65535 KB
    难度:4
     
    描述
    南阳理工学院校园里有一些小河和一些湖泊,现在,我们把它们通一看成水池,假设有一张我们学校的某处的地图,这个地图上仅标识了此处是否是水池,现在,你的任务来了,请用计算机算出该地图中共有几个水池。
     
    输入
    第一行输入一个整数N,表示共有N组测试数据
    每一组数据都是先输入该地图的行数m(0<m<100)与列数n(0<n<100),然后,输入接下来的m行每行输入n个数,表示此处有水还是没水(1表示此处是水池,0表示此处是地面)
    输出
    输出该地图中水池的个数。
    要注意,每个水池的旁边(上下左右四个位置)如果还是水池的话的话,它们可以看做是同一个水池。
    样例输入
    2
    3 4
    1 0 0 0 
    0 0 1 1
    1 1 1 0
    5 5
    1 1 1 1 0
    0 0 1 0 1
    0 0 0 0 0
    1 1 1 0 0
    0 0 1 1 1
    样例输出
    2
    3
    来源
    [张云聪]原创
    上传者
    张云聪
     题目是中文题  要你求连通的块数 1为水池 wa了好几次 因为把m改成了n 一直wa 后来改的时候才发现 最坑爹是案例竟然过了
    BFS
     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <queue>
     5 using namespace std;
     6 #define max 101
     7 int  map[max][max];
     8 int flag[max][max];
     9 int m,n;
    10 int d[4][2]={{0,1},{-1,0},{0,-1},{1,0}};
    11 struct node
    12 {
    13     int x,y;
    14 };
    15 
    16 void bfs(int i,int j)
    17 {
    18     queue < node >q;
    19     node s,t;
    20     s.x=i;
    21     s.y=j;
    22     q.push(s);
    23 //    flag[i][j]=1;
    24     while (!q.empty())
    25     {
    26         t=q.front();
    27         q.pop();
    28     //    flag[t.x][t.y]=1;
    29         for (int i=0;i<4;i++)
    30         {
    31             s.x=t.x+d[i][0];
    32             s.y=t.y+d[i][1];
    33             if (map[s.x][s.y]&&s.x>=0&&s.x<n&&s.y<m&&s.y>=0&&!flag[s.x][s.y])
    34             {
    35             //    flag[s.x][s.y]=1;
    36                 q.push(s);
    37             }
    38             flag[s.x][s.y]=1;
    39         }
    40     }
    41 }
    42 
    43 int main()
    44 {
    45     int T;
    46     cin>>T;
    47     while (T--)
    48     {
    49         cin>>n>>m;
    50         int i,j;
    51         for (i=0;i<n;i++)    
    52             for (j=0;j<m;j++)        
    53                 scanf("%d",&map[i][j]);
    54             memset(flag,0,sizeof(flag));
    55             int sum=0;
    56             for (i=0;i<n;i++)
    57             {
    58                 for (j=0;j<m;j++)
    59                 {
    60                     if (map[i][j]&&!flag[i][j])
    61                     {                          
    62                         bfs(i,j);
    63                         sum++;
    64                     }              
    65                 }
    66             }
    67             cout<<sum<<endl;
    68     }
    69     return 0;
    70 }
    dfs
     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 using namespace std;
     5 #define max 101
     6 int  map[max][max];
     7 int flag[max][max];
     8 int m,n;
     9 
    10 void dfs(int i,int j)
    11 {
    12     if (i<0||i>=n||j<0||j>=m||flag[i][j]||!map[i][j])
    13     {
    14         return ;
    15     }
    16     flag[i][j]=1;
    17     dfs(i,j+1);
    18     dfs(i-1,j); 
    19     dfs(i,j-1);
    20     dfs(i+1,j); 
    21 }
    22 
    23 int main()
    24 {
    25     int T;
    26     cin>>T;
    27     while (T--)
    28     {
    29         cin>>n>>m;
    30         int i,j;
    31         for (i=0;i<n;i++)    
    32             for (j=0;j<m;j++)        
    33                 scanf("%d",&map[i][j]);
    34             memset(flag,0,sizeof(flag));
    35             int sum=0;
    36             for (i=0;i<n;i++)
    37             {
    38                 for (j=0;j<m;j++)
    39                 {
    40                     if (map[i][j]&&!flag[i][j])
    41                     {  
    42                         //flag[i][j]=1;
    43                         dfs(i,j);
    44                         sum++;
    45                     }              
    46                 }
    47             }
    48             cout<<sum<<endl;
    49     }
    50     return 0;
    51 }
  • 相关阅读:
    2020多校补题集
    2020牛客多校第10场C Decrement on the Tree树上路径删除
    主席树模板(查询区间第K大的元素)
    第一次小赛
    计算几何小知识整理
    咸鱼暂时退圈
    mysql 格式化时间
    mysql 中国省份城市数据库表
    CF786B Legacy (线段树优化建图模板)
    树上两点期望距离
  • 原文地址:https://www.cnblogs.com/wujianwei/p/2609722.html
Copyright © 2020-2023  润新知