NYOJ27-水池数目

水池数目
时间限制:3000 ms    内存限制:65535 KB
难度:4
描述
南阳理工学院校园里有一些小河和一些湖泊,现在,我们把它们通一看成水池,假设有一张我们学校的某处的地图,这个地图上仅标识了此处

是否是水池,现在,你的任务来了,请用计算机算出该地图中共有几个水池。

输入
第一行输入一个整数N,表示共有N组测试数据
每一组数据都是先输入该地图的行数m(0m100)与列数n(0n100),然后,输入接下来的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

思路:DFS,搜索小池子周边所有相邻的池子,标记为已经搜索过,总记录为一个大池子,再遇到没标记的,继续按此法标记并计数
AC代码:

#include<stdio.h>
#include<string.h>
int sum;
struct node
{
   int num,flag;
}a[110][110];
void Fun(int x,int y,int n,int m)
{
     if(a[x][y].num==1&&a[x][y].flag==0)
     {
        a[x][y].flag=1;
     }     

     if(x+1<n&&a[x+1][y].num==1&&a[x+1][y].flag==0)
     {
        Fun(x+1,y,n,m);
     }
     if(x-1>=0&&a[x-1][y].num==1&&a[x-1][y].flag==0)
     {
        Fun(x-1,y,n,m);
     }
     if(y+1<m&&a[x][y+1].num==1&&a[x][y+1].flag==0)
     {
        Fun(x,y+1,n,m);
     }
     if(y-1>=0&&a[x][y-1].num==1&&a[x][y-1].flag==0)
     {
        Fun(x,y-1,n,m);
     }
}
int main()
{
    int i,j,T,n,m;
    scanf("%d",&T);
    while(T--)
    {
       scanf("%d%d",&n,&m);
       memset(a,0,sizeof(a));
       for(i=0;i<n;i++)
       for(j=0;j<m;j++)
       scanf("%d",&a[i][j].num);
       sum=0;
       for(i=0;i<n;i++)
       for(j=0;j<m;j++)
       {
          if(a[i][j].num==1&&a[i][j].flag==0)
          {
             Fun(i,j,n,m);
             sum++;
          }
       }
       printf("%d\n",sum);
    }
    return 0;
}
时间: 2024-08-07 08:29:14

NYOJ27-水池数目的相关文章

NYOJ 27

  水池数目 时间限制:3000 ms | 内存限制:65535 KB 难度:4   描述 南阳理工学院校园里有一些小河和一些湖泊,现在,我们把它们通一看成水池,假设有一张我们学校的某处的地图,这个地图上仅标识了此处是否是水池,现在,你的任务来了,请用计算机算出该地图中共有几个水池.   输入 第一行输入一个整数N,表示共有N组测试数据每一组数据都是先输入该地图的行数m(0<m<100)与列数n(0<n<100),然后,输入接下来的m行每行输入n个数,表示此处有水还是没水(1表示此

ip-用java计算IP段可用的IP数目

问题描述 用java计算IP段可用的IP数目 例如有个ip/掩码是 14.17.17.136/29计算可用的IP,求详细说明! 解决方案 ip转化为二进制,29转化为00000000000000000000000000000111,相与即所有子网数,可用子网再减去2 解决方案二: 参考IP地址,子网掩码,地址池计算Java代码

java 买不到的数目解题思路

问题描述 java 买不到的数目解题思路 问题描述小明开了一家糖果店.他别出心裁:把水果糖包成4颗一包和7颗一包的两种.糖果不能拆包卖.小朋友来买糖的时候,他就用这两种包装来组合.当然有些糖果数目是无法组合出来的,比如要买 10 颗糖.你可以用计算机测试一下,在这种包装情况下,最大不能买到的数量是17.大于17的任何数字都可以用4和7组合出来.本题的要求就是在已知两个包装的数量时,求最大不能组合出的数字.输入格式两个正整数,表示每种包装中糖的颗数(都不多于1000)输出格式一个正整数,表示最大不

算法:求n*m网格内矩形的数目

一个n*m的网格,求这个网格中矩形的数目. 比如以下2*2网格,总共有9个矩形:4个1*1的矩形,4个1*2的矩形,1个2*2的矩形 算法1:动态规划,假设dp[i][j]表示以第 i 行第 j 列的格子为右下角顶点的矩形数目,那么dp[i][j] = 1 + dp[i-1][j] + dp[i][j-1] – dp[i-1][j-1] , 这里的1表示i ,j 位置的格子自身构成1*1的矩形,之所以减去dp[i-1][j-1], 因为dp[i-1][j] 和 dp[i][j-1] 都包含了dp

SQL Server误区:TempDB的文件数和需要和CPU数目保持一致

误区 #12:TempDB的文件数和需要和CPU数目保持一致 错误 哎,由于上述误区是微软"官方"的建议,并且还有大量博文坚持这个观点,这个误区已经是老生常谈. 但让人困惑的是SQL CAT团队给出的建议就是1:1,但这个建议是源自扩展方面的原理来说,而不是一个通用法则.因为他们所面对的大型客户数据量服务器和IO子系统都是大部分人没有机会遇到的. 每个实例仅仅允许有一个TempDb,但需要用到TempDB的地方却有很多,所以TempDB很容易成为性能瓶颈,我想大家数人都了解这一点,而大

wps文字如何修改近期文档数目

  在wps文字中修改近期文档数目的方法: 一.在电脑桌面的wps文字程序图标上双击鼠标左键,将其打开运行.如图所示; 二.在打开的wps文字窗口中,点击左上角的"wps文字"命令选项.如图所示; 三.在弹出的"wps文字"命令选项对话框中,选择并点击"选项"命令选项.如图所示; 四.点击"选项"命令选项后,这个时候会弹出工作簿的"选项"对话框.如图所示; 五.在"选项"对话框中,选择左

如何在wps文字中修改近期文档数目

  在wps文字中修改近期文档数目的方法: 一.在电脑桌面的wps文字程序图标上双击鼠标左键,将其打开运行.如图所示; 二.在打开的wps文字窗口中,点击左上角的"wps文字"命令选项.如图所示; 三.在弹出的"wps文字"命令选项对话框中,选择并点击"选项"命令选项.如图所示; 四.点击"选项"命令选项后,这个时候会弹出工作簿的"选项"对话框.如图所示; 五.在"选项"对话框中,选择左

Linux终端上统计指定类型文件的数目的方法

  下面我们来看看在一个目录中用 ls,grep 和 wc 命令统计指定类型文件数目的技巧.命令之间的交互通过命名管道完成. grep – 用户根据给定模式或正则表达式进行搜索的命令. wc – 用于统计行.字和字符的命令. 统计普通文件的数目 在 Linux 中,普通文件用符号 - 表示. 代码如下: tecmint@tecmint ~/Linux-Tricks $ ls -l | grep ^- | wc -l 7 统计目录的数目 在 Linux 中,目录用符号 d 表示. 代码如下: te

修改PowerPoint 2007最近使用的文档数目

  PowerPoint有着记录最近使用的文档的功能,这个功能怎么说呢,有利也有弊吧,对于自己可以很快的打开之前的文档,而对于别人,就能轻轻松松访问你的文档,即使你藏的再深,也打得开.下面来教大家修改这个数字. ①启动PowerPoint,单击office按钮,可以看到记录了3个最近打开的文档,我们点击下面的PowerPoint选项. ②然后在弹出的界面切换到高级标签. ③修改最近使用的文档数目,0~50都行. ④确定之后,在看看吧,这样就不怕私密文档被别人打开了.