c语言——菌落问题

1.题目描述

       菌落的数量对医生来说一直是一个很重要的数据,但是细菌数量太多人工又无法计数,因此你能写人程序都助医生完成这人任冬么?有一张n和的菌落的显微镜照片,每个格子是0(表示当前位置无细菌)或者1(表示当前位置是细菌),请你输出这张照片中菌落的数量如果一个细菌,其上下左右四个方向有细菌的话,则这些相邻的细菌属于一个菌落。例如给定如下照片:
0010
0101
1100
则给出的照片一共有A,B,C三个菌落,如下:
00A
OBOC
B B O0

2.输入和输出

输入数据第一行两个整数n,m (1<=n,m<=100),表示照片的长和宽接下来n行,每行都有m个用空格隔开的整数(0或者1),表示这一照片行的状态(有无细菌)

输出一个整数,表示该张照片中菌落数量

3.样例输入

35
00101
01011
11001

4.样例输出

3

5.解题思路

将录入数据的数组中的1都变为-1.防止后续使用count计数时造成干扰;

构建一个递归函数f(行,列),通过对行列加1和减1,对相邻元素进行排查,若为-1,则变为count,并对该元素的相邻元素进行排查,以此将同属一个菌落的细菌都变成count;

void f(int x,int y){
int k,b,c;
int h[4]={0,1,-1,0};
int l[4]={-1,0,0,1};
for(k=0;k<=3;k++){
    b=x+h[k];
    c=y+l[k];
    if(a[b][c]==-1){
        a[b][c]=a[x][y];
        f(b,c);
    }

6.代码

#include<stdio.h>
int a[105][105]={0};
void f(int x,int y){
int k,b,c;
int h[4]={0,1,-1,0};
int l[4]={-1,0,0,1};
for(k=0;k<=3;k++){
    b=x+h[k];
    c=y+l[k];
    if(a[b][c]==-1){
        a[b][c]=a[x][y];
        f(b,c);
    }

}
}
int main()
{
int n,m;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
scanf("%d",&a[i][j]);
if(a[i][j]==1)a[i][j]=-1;
}
}
int count=0;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(a[i][j]==-1){
count++;
a[i][j]=count;
f(i,j);
}
}
}
printf("%d",count);
    return 0;
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
校园悬赏任务平台对字典管理、论坛管理、任务资讯任务资讯公告管理、接取用户管理、任务管理、任务咨询管理、任务收藏管理、任务评价管理、任务订单管理、发布用户管理、管理员管理等进行集中化处理。经过前面自己查阅的网络知识,加上自己在学校课堂上学习的知识,决定开发系统选择小程序模式这种高效率的模式完成系统功能开发。这种模式让操作员基于浏览器的方式进行网站访问,采用的主流的Java语言这种面向对象的语言进行校园悬赏任务平台程序的开发,在数据库的选择上面,选择功能强大的Mysql数据库进行数据的存放操作。校园悬赏任务平台的开发让用户查看任务信息变得容易,让管理员高效管理任务信息。 校园悬赏任务平台具有管理员角色,用户角色,这几个操作权限。 校园悬赏任务平台针对管理员设置的功能有:添加并管理各种类型信息,管理用户账户信息,管理任务信息,管理任务资讯公告信息等内容。 校园悬赏任务平台针对用户设置的功能有:查看并修改个人信息,查看任务信息,查看任务资讯公告信息等内容。 系统登录功能是程序必不可少的功能,在登录页面必填的数据有两项,一项就是账号,另一项数据就是密码,当管理员正确填写并提交这二者数据之后,管理员就可以进入系统后台功能操作区。项目管理页面提供的功能操作有:查看任务,删除任务操作,新增任务操作,修改任务操作。任务资讯公告信息管理页面提供的功能操作有:新增任务资讯公告,修改任务资讯公告,删除任务资讯公告操作。任务资讯公告类型管理页面显示所有任务资讯公告类型,在此页面既可以让管理员添加新的任务资讯公告信息类型,也能对已有的任务资讯公告类型信息执行编辑更新,失效的任务资讯公告类型信息也能让管理员快速删除。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值