连通问题、

BMP是常见的图像存储格式。

如果用来存黑白图像(颜色深度=1),则其信息比较容易读取。

与之相关的数据:

(以下偏移均是从文件头开始)

偏移:10字节, 长度4字节: 图像数据真正开始的位置。

偏移:18字节, 长度4字节: 位图的宽度,单位是像素。

偏移:22字节, 长度4字节: 位图的高度,单位是像素。

从图像数据开始处,每个像素用1个二进制位表示。

从图片的底行开始,一行一行向上存储。

Windows规定图像文件中一个扫描行所占的字节数必须是4字节的倍数,

不足的位均以 0 填充。例如,图片宽度为45像素,实际上每行会占用

8个字节。

可以通过Windows自带的画图工具生成和编辑二进制图像。

需要在“属性”中选择“黑白”,指定为二值图像。

可能需要通过 查看 | 缩放 | 自定义… 把图像变大比例一些,

更易于操作。

图像的左下角为图像数据的开始位置。白色对应1,黑色对应0

我们可以定义:两个点距离如果小于2个像素,则认为这两个点连通。

也就是说:以一个点为中心的九宫格中,围绕它的8个点与它都是连通的。

如:t1.bmp 所示,左下角的点组成一个连通的群体;

而右上角的点都是孤立的。

        in.bmp                                t1.bmp

程序的目标是:根据给定的黑白位图,分析出所有独立连通的群体,

输出每个连通群体的面积。所谓面积,就是它含有的像素的个数。

输入数据固定存在in.bmp中。

如示例的in.bmp,

程序应该输出:

81

133

该输出表示:共有4个连通群体。

输出的连通体面积间的顺序可以随意。

请编程解决上述问题。

我们测试程序的时候,会使用不同的in.bmp文件。

要求考生把所有类写在一个文件中。

调试好后,存入与考生文件夹下对应题号的“解答.txt”中即可。

相关的工程文件不要拷入。请不要使用package语句。







这题要读入图片文件数据,感觉头大啊,此前做的题,几乎没有遇到要读取文件中的数据,而现在竟然还碰到了读取图片的数据,看到此题的核心:即使用DFS求取连通图的问题,并且返回每一个连通图中包含的顶点个数,但是对于此题处理读取数据的问题,就没有仔细去探究,下面贴出一段网友的C语言代码,以作参考:

include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#include<string.h> void main(){
int i,j,k,m;
int width,height,start,world;
int *bmp,*Lcount;
bool *Lflag;
FILE *fp;
if((fp=fopen("in1.bmp","rb"))==NULL){
printf("文件打开失败");
return;
}
fseek(fp,10L,0);
fscanf(fp,"%4c",&start); // 4c表示该数据占4个字节
// printf("start = %d\n",start);
fseek(fp,18,0);
fscanf(fp,"%4c",&width);
// printf("width = %d\n",width);
fseek(fp,22,0);
fscanf(fp,"%4c",&height);
// printf("height = %d\n",height);
bmp = (int*)malloc((width+2)*sizeof(int));
memset(bmp,0,(width+2)*sizeof(int));
Lcount = (int*)malloc(width*sizeof(int));
memset(Lcount,0,width*sizeof(int));
Lflag = (bool*)malloc(width*sizeof(bool));
memset(Lflag,0,width*sizeof(bool));
Lcount--;
Lflag--;
fseek(fp,start,0);
world = ( width%32 ? width/32+1 : width/32 )*4;
int last,i1,i2,i3;
int eCount = 0
for(i=0 i<height i++ ){
char c;
k=1;
last=0;
for(j=0 j<world j++){
fscanf(fp,"%c",&c);
for(m = 7 m >= 0 && k<=width m-- ){
if( !( 1<<m & c ) ){
//printf("*");
if(bmp[k]){
last = bmp[k];
Lcount[last]++;
Lflag[last] = true
}
else{
i1 = last ? last : bmp[k-1]
i3 = bmp[k+1]
last = 0;
if( i1 || i3){
if( i1 && i3 && ( i1 != i3 ) ){//确定需要连接
Lcount[i1] += Lcount[i3]
Lcount[i3]=0;
for(i2=1;i2<=width i2++){
if(bmp[i2]==i3)
bmp[i2] = i1;
}
}
else{
if(!i1)
i1=i3;
}
bmp[k] = i1
Lcount[i1]++;
Lflag[i1] = true
}
else{//插入
for(i2=1;Lcount[i2];i2++);
Lcount[i2]=1;
bmp[k] = i2
Lflag[i2] = true
}
}
}
else{ //printf(" ");
last = bmp[k]
bmp[k] = 0
}
k++;
}
}
//printf("\n");
for(i2=1;i2<=width;i2++){
if(Lcount[i2] && !Lflag[i2] ){
printf("%d\n",Lcount[i2]);
Lcount[i2] = 0
eCount++;
}
Lflag[i2]=false;
}
}
fclose(fp);
free(Lflag+1);
free(Lcount+1);
free(bmp);
printf("count=%d\n",eCount);
}

java实现第二届蓝桥杯连通问题(C++)的更多相关文章

  1. java实现第二届蓝桥杯地铁换乘(C++)

    地铁换乘. 为解决交通难题,某城市修建了若干条交错的地铁线路,线路名及其所属站名如stations.txt所示. 线1 苹果园 .... 四惠东 线2 西直门 车公庄 .... 建国门 线4 .... ...

  2. java实现第二届蓝桥杯最小公倍数(c++)

    最小公倍数. 为什么1小时有60分钟,而不是100分钟呢?这是历史上的习惯导致. 但也并非纯粹的偶然:60是个优秀的数字,它的因子比较多. 事实上,它是1至6的每个数字的倍数.即1,2,3,4,5,6 ...

  3. java实现第二届蓝桥杯异或加密法

    异或加密法. 在对文本进行简单加密的时候,可以选择用一个n位的二进制数,对原文进行异或运算. 解密的方法就是再执行一次同样的操作. 加密过程中n位二进制数会循环使用.并且其长度也可能不是8的整数倍. ...

  4. java实现第二届蓝桥杯四方定理

    四方定理. 数论中有著名的四方定理:所有自然数至多只要用四个数的平方和就可以表示. 我们可以通过计算机验证其在有限范围的正确性. 对于大数,简单的循环嵌套是不适宜的.下面的代码给出了一种分解方案. 请 ...

  5. Java实现第九届蓝桥杯全球变暖

    全球变暖 题目描述 你有一张某海域NxN像素的照片,"."表示海洋."#"表示陆地,如下所示: ....... .##.... .##.... ....##. ...

  6. 算法笔记_199:第二届蓝桥杯软件类决赛真题(C语言本科)

    前言:以下代码部分仅供参考,C语言解答部分全部来自网友,Java语言部分部分参考自网友,对于答案的正确性不能完全保证. 试题1 数论中有著名的四方定理:所有自然数至多只要用四个数的平方和就可以表示. ...

  7. Java实现第九届蓝桥杯小朋友崇拜圈

    小朋友崇拜圈 题目描述 班里N个小朋友,每个人都有自己最崇拜的一个小朋友(也可以是自己). 在一个游戏中,需要小朋友坐一个圈, 每个小朋友都有自己最崇拜的小朋友在他的右手边. 求满足条件的圈最大多少人 ...

  8. 第二届蓝桥杯C++B组国(决)赛真题

    以下代码仅供参考,解答部分来自网友,对于正确性不能保证,如有错误欢迎评论 四方定理. 数论中有著名的四方定理:所有自然数至多只要用四个数的平方和就可以表示. 我们可以通过计算机验证其在有限范围的正确性 ...

  9. Java实现第九届蓝桥杯倍数问题

    倍数问题 题目描述 [题目描述] 众所周知,小葱同学擅长计算,尤其擅长计算一个数是否是另外一个数的倍数.但小葱只擅长两个数的情况,当有很多个数之后就会比较苦恼.现在小葱给了你 n 个数,希望你从这 n ...

随机推荐

  1. 业务系统请求zabbix图表性能调优

    性能调优实践 性能调优实践 背景 问题分析 后端优化排查 前端优化排查 后端长响应排查 zabbix server 优化 总结 背景 用 vue.js 的框架 ant-design vue pro 实 ...

  2. 基于 abp vNext 和 .NET Core 开发博客项目

    项目介绍 此个人博客项目底层基于 ABP Framework (不完全依赖)搭建项目 和免费开源跨平台的 .NET Core 3.1 开发,可作为 .NET Core 入门项目进行学习,支持各种主流数 ...

  3. Gradle 多环境、多渠道打包

    最近项目从eclipse迁移到AS上,主要是为了使用gradle这个插件进行apk打包.毕竟程序员还是要与时俱进的.首先介绍下项目主要需求: 1.使用百度统计,需要对个平台的信息进行统计 2..api ...

  4. Tomcat session的实现:线程安全与管理

    本文所说的session是单机版本的session, 事实上在当前的互联网实践中已经不太存在这种定义了.我们主要讨论的是其安全共享的实现,只从理论上来讨论,不必太过在意实用性问题. 1. sessio ...

  5. Mysql 常用数据库操作

    一.数据库操作: 1.查看数据库: >SHOW DATABASES; 2.创建数据库: >CREATE DATABASE db_name; //db_name为数据库名 3.使用数据库: ...

  6. 仅需60秒,使用k3sup快速部署高可用K3s集群

    作者简介 Dmitriy Akulov,连续创业者,16岁时搭建了开源CDN公共服务jsDelivr的v1版本.目前是边缘托管平台appfleet创始人. 原文链接: https://ma.ttias ...

  7. webpack指南(六)命令行环境配置

    webpack 命令行环境配置中,通过设置 --env 可以使你根据需要,传入尽可能多的环境变量.在 webpack.config.js 文件中可以访问到这些环境变量. webpack --env.N ...

  8. 【Django】rest_framework 序列化自定义替换返回值

    # 序列化设置 class PagerSerialiser(serializers.ModelSerializer): name = serializers.CharField(source=&quo ...

  9. Django分页之应用案例

    项目文件: models.py(建表) from django.db import models # Create your models here. class Book(models.Model) ...

  10. mysql小白系列_03 体系结构-线程池

    thread pool的原理是什么? 为什么用double write就能解决page坏的问题? Innodb redo log 与 binlog有什么区别?有了Innodb redo log为什么还 ...