java实现第二届蓝桥杯连通问题(C++)
连通问题、
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++)的更多相关文章
- java实现第二届蓝桥杯地铁换乘(C++)
地铁换乘. 为解决交通难题,某城市修建了若干条交错的地铁线路,线路名及其所属站名如stations.txt所示. 线1 苹果园 .... 四惠东 线2 西直门 车公庄 .... 建国门 线4 .... ...
- java实现第二届蓝桥杯最小公倍数(c++)
最小公倍数. 为什么1小时有60分钟,而不是100分钟呢?这是历史上的习惯导致. 但也并非纯粹的偶然:60是个优秀的数字,它的因子比较多. 事实上,它是1至6的每个数字的倍数.即1,2,3,4,5,6 ...
- java实现第二届蓝桥杯异或加密法
异或加密法. 在对文本进行简单加密的时候,可以选择用一个n位的二进制数,对原文进行异或运算. 解密的方法就是再执行一次同样的操作. 加密过程中n位二进制数会循环使用.并且其长度也可能不是8的整数倍. ...
- java实现第二届蓝桥杯四方定理
四方定理. 数论中有著名的四方定理:所有自然数至多只要用四个数的平方和就可以表示. 我们可以通过计算机验证其在有限范围的正确性. 对于大数,简单的循环嵌套是不适宜的.下面的代码给出了一种分解方案. 请 ...
- Java实现第九届蓝桥杯全球变暖
全球变暖 题目描述 你有一张某海域NxN像素的照片,"."表示海洋."#"表示陆地,如下所示: ....... .##.... .##.... ....##. ...
- 算法笔记_199:第二届蓝桥杯软件类决赛真题(C语言本科)
前言:以下代码部分仅供参考,C语言解答部分全部来自网友,Java语言部分部分参考自网友,对于答案的正确性不能完全保证. 试题1 数论中有著名的四方定理:所有自然数至多只要用四个数的平方和就可以表示. ...
- Java实现第九届蓝桥杯小朋友崇拜圈
小朋友崇拜圈 题目描述 班里N个小朋友,每个人都有自己最崇拜的一个小朋友(也可以是自己). 在一个游戏中,需要小朋友坐一个圈, 每个小朋友都有自己最崇拜的小朋友在他的右手边. 求满足条件的圈最大多少人 ...
- 第二届蓝桥杯C++B组国(决)赛真题
以下代码仅供参考,解答部分来自网友,对于正确性不能保证,如有错误欢迎评论 四方定理. 数论中有著名的四方定理:所有自然数至多只要用四个数的平方和就可以表示. 我们可以通过计算机验证其在有限范围的正确性 ...
- Java实现第九届蓝桥杯倍数问题
倍数问题 题目描述 [题目描述] 众所周知,小葱同学擅长计算,尤其擅长计算一个数是否是另外一个数的倍数.但小葱只擅长两个数的情况,当有很多个数之后就会比较苦恼.现在小葱给了你 n 个数,希望你从这 n ...
随机推荐
- flink入门学习
Flink学习笔记 一.简介 1.定义: 针对流数据和批数据的分布式处理引擎.它主要是由 Java 代码实现.. 2.应用场景: 流数据:把所有任务当成流来处理,处理观察和分析连续事件产生的数 ...
- 手写一个简易的多周期 MIPS CPU
一点前言 多周期 CPU 相比单周期 CPU 以及流水线 CPU 实现来说其实写起来要麻烦那么一些,但是相对于流水线 CPU 和单周期 CPU 而言,多周期 CPU 除了能提升主频之外似乎并没有什么卵 ...
- elasticsearch kibana + 分词器安装详细步骤
elasticsearch kibana + 分词器安装详细步骤 一.准备环境 系统:Centos7 JDK安装包:jdk-8u191-linux-x64.tar.gz ES安装包:elasticse ...
- flex布局学习总结--阮一峰
基本概念: 采用 Flex 布局的元素,称为 Flex 容器(flex container),简称"容器".它的所有子元素自动成为容器成员,称为 Flex 项目(flex it ...
- 00005-js 获取uuid
admin.guid = function () { function S4() { return (((1+Math.random())*0x10000)|0).toString(16).subst ...
- python3.x 基础二:内置函数
自带的函数可以非常简单快捷的实现某些功能, 比如产生一个序列,可以用循环实现: count = 0 while count < 10: print(count) count+=1 但其实用ran ...
- 去掉shiro登录时url里的JSESSIONID https://blog.csdn.net/aofavx/article/details/51701012
经过查找论坛和分析源码,确认了是在ShiroHttpServletResponse里加上的. 因此继承ShiroHttpServletResponse类,覆盖相应方法,再重写 ShiroFilterF ...
- thymeleaf将对象Model数据抛到HTML页面
thymeleaf名称空间 <!DOCTYPE html> <html lang="en" xmlns:th="http://www.thymelea ...
- overflow:hidden的清除浮动效果
我们都知道"overflow:hidden"可以溢出隐藏,即当内容元素的高度大于其包含块的高度时,设置该属性即可把内容区域超出来的部分隐藏,使内容区域完全包含在该包含块中. 然而& ...
- 透过面试题掌握Redis【持续更新中】
本文已收录到1.1K Star的Github开源项目<面试指北>,想要了解更多内容,大家可以看一看这个项目,希望大家帮忙给一个star,谢谢了! <面试指北>项目地址:http ...