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的更多相关文章
随机推荐
- android studio打包出现翻译问题
错误信息: Error:(16) Error: "baidutieba_client_inavailable" is not translated in "en" ...
- C++的一个奇技淫巧
C++如何写一个函数,得到一个数组的长度呢? size_t GetArrayLength(int Array []) { return sizeof(Array)/sizeof(Array[0]); ...
- Linux初记
ctrl+u可以在shell下删除行,如果此键不起作用,就试试ctrl+x ctrl+z可以将程序挂起,不会终止程序,但可以将程序挂起. 通过fg命令可再把此作业切换到前台 cp命令的目标文件如果是一 ...
- DBCC 命令2
状态查询:收集和显示各类信息,状态检查. 如cachestats.pss.sqlmgrstats.memorystatus.proccache.freeproccache.freesystemcach ...
- C# - JSON详解
最近在做微信开发时用到了一些json的问题,就是把微信返回回来的一些json数据做一些处理,但是之前json掌握的不好,浪费了好多时间在查找一些json有关的转换问题,我所知道的方法只有把json序列 ...
- Java多线程5:synchronized锁方法块
synchronized同步代码块 用关键字synchronized声明方法在某些情况下是有弊端的,比如A线程调用同步方法执行一个较长时间的任务,那么B线程必须等待比较长的时间.这种情况下可以尝试使用 ...
- 统计第一个空字符前面的字符长度(java实现)
举例来说:char buf[] = {'a','b','c','d','e','f','\0','x','y','z'}当输入N=10或20,期待输出是6:当输入N=3或5,期待输出是3或5. pac ...
- css计数器详解
什么是css计数器 体验更佳排版请戳原文链接:http://blog.liuxianan.com/css-counters.html 就是采用css给一些html元素自动生成编号,比如类似1.3.2这 ...
- 定时关闭AWS上的EC2机器实例
最近一段时间在做一个产品从阿里云向亚马逊云中国区迁移的前期试验.亚马逊中国区并没有开放免费体验账号,使用的每一份资源都要实打实的掏钱.而为了实验我们使用时一般要启动好几台EC2实例.为了不浪费辛辛苦苦 ...
- 跨站脚本攻击XSS
跨站脚本攻击(Cross Site Script为了区别于CSS简称为XSS)指的是恶意攻击者往Web页面里插入恶意html代码,当用户浏览该页之时,嵌入其中Web里面的html代码会被执行,从而达到 ...