连通问题、

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. 2020年第二届“网鼎杯”网络安全大赛 白虎组 部分题目Writeup

    2020年第二届“网鼎杯”网络安全大赛 白虎组 部分题目Writeup 2020年网鼎杯白虎组赛题.zip下载 https://download.csdn.net/download/jameswhit ...

  2. tp5.1 nginx环境下url去掉index.php

    原来的地址http://xxxxxxx/index.php/admin/login/index.html 修改完的路径http://xxxxxxx/admin/login/index.html 修改. ...

  3. Java内存区域与内存溢出异常——深入理解Java虚拟机 笔记一

    Java内存区域 对比与C和C++,Java程序员不需要时时刻刻在意对象的创建和删除过程造成的内存溢出.内存泄露等问题,Java虚拟机很好地帮助我们解决了内存管理的问题,但深入理解Java内存区域,有 ...

  4. React实践:自定义html特性不显示

    发现React中自定义的html特性在render后是不现实,而且getAttribute方法也只能获取到undefined. 后来去stackoverflow提问,网友回答说: It depends ...

  5. Maven 私服你应该不陌生吧,可你会用 Artifactory 搭建吗?

    JFrog Artifactory 是一个 Artifacts 仓库管理平台,它支持所有的主流打包格式.构建工具和持续集成(CI)服务器.它将所有二进制内容保存在一个单一位置并提供一个接口,这使得用户 ...

  6. DOM面试题

    1.利用冒泡和不利用冒泡的差别 答案: 1.绑定位置不同:不利用冒泡绑定在目标元素上,利用冒泡绑定在父元素上. 2.监听对象的个数不同:不利用冒泡会反复创建多个监听,利用冒泡始终只有 一个监听. 3. ...

  7. vue项目中使用bpmn-流程图json属性转xml(七篇更新完成)

    内容概述 本系列“vue项目中使用bpmn-xxxx”分为七篇,均为自己使用过程中用到的实例,手工原创,目前陆续更新中.主要包括vue项目中bpmn使用实例.应用技巧.基本知识点总结和需要注意事项,具 ...

  8. Webconfig配置刷新时间,前台页面调用这个时间

    <configuration> <appSettings> <add key="webpages:Version" value="2.0.0 ...

  9. Poj2109 (2) k^n = p.

    二分法,由p最大值最小值的中间值开始猜k,通过比较pow(k,n)与p的大小来进一步精确k,直到找到. #include<stdio.h> #include<math.h> # ...

  10. 【Oracle】CentOS7/CentOS8命令行重启Oracle 11G R2

    写在前面 按照读者朋友的要求写了一篇<[Oracle]CentOS7/CentOS8命令行安装Oracle 11G R2>,由于读者完全是按照我的安装方式安装的Oracle数据库,也是将O ...