timus_1007_bfs
图像编码
题目描述:
有这样一副图,它有黑白像素,黑像素的坐标在1~10之间。有很多种方法来编码这个图。例如下面的图:

一种表示方法是只描述黑像素,并按x坐标的增序描述,如果x相同,则按y的增序描述,每个像素占一行。按这种编码方式的到的上面图像的编码为:
6
2 3
2 4
3 3
3 4
4 2
4 3
另一种表示方法是第一行包含最左边的黑像素的坐标,然后下一行是第一个黑像素的相邻黑像素,再下一行是第一个黑像素的第一个相邻黑像素的相邻黑像素(有点绕口,其实就是按bfs的方向描述),再下一行是第一个黑像素的第二个相邻黑像素的相邻黑像素,依次类推,直到描述完所有的黑像素。相邻像素的描述从右边开始,按逆时针方向,分别用R,T,L,B来表示,如果碰到某个相邻的黑像素已经被描诉了,就忽略描述该相邻黑像素。每一行都表示某个像素的相邻黑像素,并以“,”结尾。所有黑像素描述完后以“.”结尾。按这种编码方式的到的上面图像的编码为:
2 3
RT,
RT,
,
B,
,
.
要求在给定的一种图像编码的情况下,给出另一种图像编码。
思路:
如果是第一种转第二种,定义一个二维数组来表示这个图像,从最左边的那个点开始,使用bfs搜索四个方向的像素,根据是否有黑像素输出RTLB。
void change_two(int lx, int by)
{
struct queue queue;
struct coordinate coord, temp;
int flag = ; //控制输出 coord.x = lx;
coord.y = by;
init_queue(&queue);
push(&queue, coord);
printf("%d %d\n", lx, by);
map[lx][by] = ;
while (!is_empty(queue))
{
if (!flag)
flag = ;
else
printf(",\n");
coord = pop(&queue);
if (coord.x + <= && map[coord.x + ][coord.y])
{
//R
temp.x = coord.x + ;
temp.y = coord.y;
push(&queue, temp);
printf("R");
map[temp.x][temp.y] = ;
}
if (coord.y + <= && map[coord.x][coord.y + ])
{
//T
temp.x = coord.x;
temp.y = coord.y + ;
push(&queue, temp);
printf("T");
map[temp.x][temp.y] = ;
}
if (coord.x - >= && map[coord.x - ][coord.y])
{
//L
temp.x = coord.x - ;
temp.y = coord.y;
push(&queue, temp);
printf("L");
map[temp.x][temp.y] = ;
}
if (coord.y - >= && map[coord.x][coord.y - ])
{
//B
temp.x = coord.x;
temp.y = coord.y - ;
push(&queue, temp);
printf("B");
map[temp.x][temp.y] = ;
}
}
printf(".");
}
代码20-50行分别以RTLB顺序搜索当前黑像素相邻的像素,如果有黑像素,就将其坐标压入队列,等待下次处理该像素的相邻像素,同时标记map,表示已经访问了该像素。
如果是第二种转第一种,就是找到这个图像对应的二维数组。从给定的点开始,使用bfs来找到每个点相邻四周的黑像素,那后将这些黑像素标记到二维数组中。
void change_one(int lx, int by)
{
struct queue queue;
struct coordinate coord;
struct coordinate temp;
struct coordinate ans[];
char line[];
int i, j, maxx, maxy, n; maxx = coord.x = lx;
maxy = coord.y = by;
init_queue(&queue);
push(&queue, coord);
map[coord.x][coord.y] = ;
while (!is_empty(queue))
{
coord = pop(&queue);
gets(line);
i = ;
while (line[i] != ',' && line[i] != '.')
{
if (line[i] == 'R')
{
temp.x = coord.x + ;
if (temp.x > maxx)
maxx = temp.x;
temp.y = coord.y;
}
else if (line[i] == 'T')
{
temp.x = coord.x;
temp.y = coord.y + ;
if (temp.y > maxy)
maxy = temp.y;
}
else if (line[i] == 'L')
{
temp.x = coord.x - ;
temp.y = coord.y;
}
else
{
temp.x = coord.x;
temp.y = coord.y - ;
}
map[temp.x][temp.y] = ;
push(&queue, temp);
i++;
}
}
n = ;
for (i = ; i <= maxx; i++)
for (j = ; j <= maxy; j++)
if (map[i][j])
{
ans[n].x = i;
ans[n ++].y = j;
}
printf("%d\n", n);
for (i = ; i < n; i++)
printf("%d %d\n", ans[i].x, ans[i].y);
}
第二种转第一种其实是bfs的逆过程,代码第15-50行目的就是根据当前的黑色像素坐标以及输入数据来获得相邻黑色像素的坐标。
本质上这个题目考察的就是bfs,不过这道题目的输入有点麻烦,因为事先我们无法判断输入的数据是哪种编码,所以必须靠我们自己写个判断函数。我的方法是根据第一行的输入,如果第一行输入的只有一个数,说明输入是第一种编码;如果是两个数,说明是第二种编码。还有就是代码完全是用c写的,不能像使用c++那用直接使用自带的queue。所以只有靠自己实现了个循环队列,根据题目,队列中的最大个数是不会超过12的,所以自己写队列还是可以接受的,不过就是编码花的时间比较久(汗!!以后直接用c++的queue了,这样省事多了,而且代码还很健壮!!)。
timus_1007_bfs的更多相关文章
随机推荐
- vim中输入tab符
今天在写Makefile时各种出错.后来发现是all:的下一行,make前面必须是tab符,不能是空格. 但是vim中只要按tab就会自动转换成4个空格.平时编程需要,也不便把这个设置取消. 查了下, ...
- webdriver 获取alert 提示no alert is active
http://hi.baidu.com/janice515/item/bce536bb136e8441bb0e120f 摘上面: 一般正常情况下会报错,如 no alert is active 目 ...
- Java学习笔记(五)
作业1:将指定目录下的所有文件显示到列表框(JList)组件中. 代码如下: import java.awt.; import java.awt.event.; import javax.swing. ...
- 关于windows phone教务在线客户端
本人是个大二学生,由于学校的教务在线一直没出windows phone的教务在线,而且本身也对wp开发感兴趣,所以就尝试着开发一下 由于没有系统的学习,只能在摸索中前进,这背后的原理很简单,可不容易实 ...
- (原创)巩固理解基于DS18B20的1-wire协议(MCU,经验)
1.Abstract 如前篇随笔所写,将以前遇到最难懂的两个部分重拾一下.前一篇写的是I2C协议(http://www.cnblogs.com/hechengfei/p/4117840.htm ...
- java反射机制初探
最近和一位师兄交流了一下Java,真可谓是大有收获,让我好好的学习了一下javad的反射机制,同终于明白了spring等框架的一个基本实现的思想,那么今天就和大家分享一下java的反射机制. 反射,r ...
- MySql Windws 下自动备份脚本
这几天正在做一个 使用MySQL数据库的项目,目前项目已经完成了,当部署好项目之后,正在考虑如何自动备份MySql数据库的问题,我在网上找了一下资料终于解决了,特此记录一下. @echo off e ...
- 用JS识别各版本浏览器
自昨天发了各浏览器内核介绍的随笔,就闲不住了,想直接写个JS来识别用户所用浏览器版本. 写着写着却发现很多坑爹的地方,比如IE10-的版本是依循常规支持attachEvent,但到了IE11,却只支持 ...
- 【Bugly干货分享】手把手教你逆向分析 Android 程序
很多人写文章,喜欢把什么行业现状啊,研究现状啊什么的写了一大通,感觉好像在写毕业论文似的,我这不废话,先直接上几个图,感受一下. 第一张图是在把代码注入到地图里面,启动首页的时候弹出个浮窗,下载网络的 ...
- 【C语言学习】《C Primer Plus》第1章 概览
学习总结 1.C语言于1972年由贝尔实验室的Dennis Ritchie在与Ken Thompson一起设计UNIX操作系统的时候开发的.的的设计构想来源于Ken Thompson的B语言.Anyw ...