工信部软件大赛决赛题----统计连通图的个数和面积
来源:互联网 发布:计算机编程是什么专业 编辑:程序博客网 时间:2024/05/16 05:34
题目要求:
BMP是常见的图像存储格式。
如果用来存黑白图像(颜色深度=1),则其信息比较容易读取。
与之相关的数据:
(以下偏移均是从文件头开始)
偏移:10字节, 长度4字节: 图像数据真正开始的位置。
偏移:18字节, 长度4字节: 位图的宽度,单位是像素。
偏移:22字节, 长度4字节: 位图的高度,单位是像素。
从图像数据开始处,每个像素用1个二进制位表示。
从图片的底行开始,一行一行向上存储。
Windows规定图像文件中一个扫描行所占的字节数必须是4字节的倍数,
不足的位均以 0 填充。例如,图片宽度为45像素,实际上每行会占用
8个字节。
可以通过Windows自带的画图工具生成和编辑二进制图像。
需要在“属性”中选择“黑白”,指定为二值图像。
可能需要通过 查看 | 缩放 | 自定义... 把图像变大比例一些,
更易于操作。
图像的左下角为图像数据的开始位置。白色对应1,黑色对应0
我们可以定义:两个点距离如果小于2个像素,则认为这两个点连通。
也就是说:以一个点为中心的九宫格中,围绕它的8个点与它都是连通的。
如:t1.bmp 所示,左下角的点组成一个连通的群体;
而右上角的点都是孤立的。
程序的目标是:根据给定的黑白位图,分析出所有独立连通的群体,
输出每个连通群体的面积。所谓面积,就是它含有的像素的个数。
输入数据固定存在in.bmp中。
如示例的in.bmp,
程序应该输出:
12
81
52
133
该输出表示:共有4个连通群体。
输出的连通体面积间的顺序可以随意。
请编程解决上述问题。
我们测试程序的时候,会使用不同的in.bmp文件。
对于编程题目,要求选手给出的解答完全符合ANSI C标准,不能使用c++特性;
不能使用诸如绘图、中断调用等硬件相关或操作系统相关的API。
代码实现:
#include<iostream>#include<fstream>using namespace std;//检测得到每个连通图的面积,通过递归检测相邻的八个位置是否是0。(设为2表示已检测过,这样可避免重复)int perArea(int x,int y,int height,int width,int array[][100]){ int area=1; //上 if(x>0&&array[x-1][y]==0){ array[x-1][y]=2; area=area+perArea(x-1,y,height,width,array); }else array[x-1][y]=2; //下 if(x<height&&array[x+1][y]==0){ array[x+1][y]=2; area=area+perArea(x+1,y,height,width,array); }else array[x+1][y]=2; //左 if(y>0&&array[x][y-1]==0){ array[x][y-1]=2; area=area+perArea(x,y-1,height,width,array); }else array[x][y-1]=2; //右 if(y<width&&array[x][y+1]==0){ array[x][y+1]=2; area=area+perArea(x,y+1,height,width,array); }else array[x][y+1]=2; //左上if(y<width&&array[x-1][y-1]==0){ array[x-1][y-1]=2; area=area+perArea(x-1,y-1,height,width,array); }else array[x-1][y-1]=2; //右上 if(y<width&&array[x-1][y+1]==0){ array[x-1][y+1]=2; area=area+perArea(x-1,y+1,height,width,array); }else array[x-1][y+1]=2; //左下 if(y<width&&array[x+1][y-1]==0){ array[x+1][y-1]=2; area=area+perArea(x+1,y-1,height,width,array); }else array[x+1][y-1]=2; //右下 if(y<width&&array[x+1][y+1]==0){ array[x+1][y+1]=2; area=area+perArea(x+1,y+1,height,width,array); }else array[x+1][y+1]=2; return area;}//遍历数组得到连通图的个数及每个连通图的面积void compute(int array[][100],int height,int width){ for(int i=0;i<height;i++) { for(int j=0;j<width;j++) { if(array[i][j]==0) { int area=perArea(i,j,height,width,array); area=(area>1)?area-1:area; cout<<"连通图面积为:"<<area<<endl; } else array[i][j]=2; } }}//读取图片并对图片进行处理void readPic(char filename[100]){ int start,height,width;//定义图片的开始,高,宽; int use_and[]={128,64,32,16,8,4,2,1};//用于与运算 ifstream infile(filename,ios::binary); if(!infile) { cout<<"Open error!"<<endl; abort(); } infile.seekg(10,ios::beg); infile.read((char*)&start,4); cout<<"开始位置:"<<start<<endl; infile.seekg(18); infile.read((char*)&width,4); cout<<"宽:"<<width<<endl; infile.seekg(22); infile.read((char*)&height,4); cout<<"实际高:"<<height<<endl; if(width%8!=0) width=width+(8-width%8); cout<<"理论高:"<<width;//读取in.bmp文件,并把数据存入pic数组中 char pic[100][100]; infile.seekg(start); for(int i=0;i<height;i++) for(int j=0;j<(width/8);j++) { infile.read((char *)&pic[height-i-1][j],1); } cout<<endl;//关闭文件流infile.close();//把图像转化为二进制放入数组binary中 int binary[100][100];cout<<"bmp图片的二进制形式:"<<endl; for(int m=0;m<height;m++){ for(int n=0;n<width;n++){ if(pic[m][n/8]&use_and[n%8]) binary[m][n]=1; else binary[m][n]=0; cout<<binary[m][n]; } cout<<endl; }//调用函数得到连通图的个数和每个连通图的面积compute(binary,height,width); }int main(){ char str[100]; cout<<"请输入文件的路径及名称:"; cin>>str; readPic(str); return 0;}
- 工信部软件大赛决赛题----统计连通图的个数和面积
- 连通问题 解题报告 ——2011软件大赛决赛 C组 本科第5题 原创By BossDong
- poj 2117(统计连通块的个数)
- 1013. Battle Over Cities (25)-PAT甲级真题(图的遍历,统计强连通分量的个数,dfs)
- PAT甲级真题1013. Battle Over Cities (25)(图的遍历,统计强连通分量的个数,dfs)
- 华为编程大赛决赛题
- L2-013. 红色警报-PAT团体程序设计天梯赛GPLT(图的连通分量个数统计)
- [PAT甲级]1013. Battle Over Cities (25)(图的遍历,统计强连通分量个数)
- L2-013. 红色警报-PAT团体程序设计天梯赛(图的连通分量个数统计)
- poj 3180 统计连通分量元素大于一的个数
- 寻找中国的乔布斯 第二届达内发现杯软件大赛决赛开启
- 2013 蓝桥杯 全国软件大赛 c/c++ B组 决赛 第 五题
- 第七届蓝桥杯大赛个人赛(软件类)决赛真题
- 第七届蓝桥杯大赛个人赛决赛(软件类C语言B组)第一题:一步之遥
- 一个图的连通子图个数
- 无相连通图的生成树个数
- 2012蓝桥杯软件大赛决赛(源码变换)
- 2012蓝桥杯软件大赛决赛(火柴游戏)
- Android ListView从网络获取图片及文字显示
- ruby gem常用命令
- 简单介绍performance_schema数据库
- ArcGIS实用制图技巧——如何制作“光照”效果的水体多边形
- 【图像处理】利用积分图像法快速计算Haar特征
- 工信部软件大赛决赛题----统计连通图的个数和面积
- linux 后台运行命令
- Oracle 归档模式的学习
- System.Threading 命名空间
- Java NIO API详解
- yii的relations方法的使用
- Win8 图片uri保存到本地图片库 -- 及各种流之间的转换
- “常回家看看”入法背后的社会隐忧【2011-01-05】
- sqlserver 之SELECT INTO 和 INSERT INTO SELECT 两种表复制语句