【数据结构及算法】2.图像染色问题
来源:互联网 发布:java交换两个变量的值 编辑:程序博客网 时间:2024/05/19 23:24
一、题目:
3.20③ 假设以二维数组g(1..m,1..n)表示一个图像区域,g[i,j]表示该区域中点(i,j)所具颜色,其值为从0到k的整数。
编写算法置换点(i0,j0)所在区域 的颜色。约定和(i0,j0)同色的上、下、左、右的邻接点为同色区域的点。
实现下列函数: void ChangeColor(GTYPE g, int m, int n, char c, int i0, int j0);
/* 在g[1..m][1..n]中,将元素g[i0][j0] */
/* 所在的同色区域的颜色置换为颜色c */
表示图像区域的类型定义如下:
typedef char GTYPE[m+1][n+1];
Stack是一个已实现的栈。
可使用的相关类型和函数:
typedef int SElemType; // 栈Stack的元素类型
Status StackInit(Stack &s, int initsize);
Status Push(Stack &s, SElemType e);
Status Pop(Stack &s, SElemType &e);
Status StackEmpty(Stack s);
Status GetTop(Stack s, SElemType &e);
-------------------------------------------------------------------------------------------------
二、思路
像这种关于图像区域的染色问题,大多的处理方法是使用递归算法,当然,使用栈来实现也是可以的,我在这里是使用自己设计的递归算法,算法比较简单,能看懂基本的递归算法的同学都能够看懂。
另外在这里要注意一些细节,比如调用函数时的参数的正确性判断,还有就是下标是否越界的判断,这些细节决定了算法的成败。
具体思路:
1.首先将指定的点A进行染色;
2.然后分别比较其上、下、左、右位置的四个点,若它们的颜色与A点原来的颜色相同,则分别对其调用染色函数。注意,在比较之前,需要先判断A点的上、下、左、右位置的四个点是否存在,即需要检验下标是否越界。
-------------------------------------------------------------------------------------------------
三、代码(C/C++)
C代码 void ChangeColor(GTYPE g, int m, int n, char c, int i0, int j0) /* 在g[1..m][1..n]中,将元素g[i0][j0] */ /* 所在的同色区域的颜色置换为颜色c */ { if(i0>m||j0>n)//初次调用时下标不合法 { return; } int color; color=g[i0][j0]; g[i0][j0]=c; if(i0-1>=1)//判断是否越界,下同 { if(g[i0-1][j0]==color) { ChangeColor(g,m,n,c,i0-1,j0); } } if(i0+1<=m) { if(g[i0+1][j0]==color) { ChangeColor(g,m,n,c,i0+1,j0); } } if(j0-1>=1) { if(g[i0][j0-1]==color) { ChangeColor(g,m,n,c,i0,j0-1); } } if(j0+1<=n) { if(g[i0][j0+1]==color) { ChangeColor(g,m,n,c,i0,j0+1); } } }
四、总结
第一个独立思考搞出来的递归算法,嘿嘿,留个纪念,之前弄斐波拉契数列的递归不是很会,这个是自己想出来的,mark。
- 【数据结构及算法】2.图像染色问题
- 图像染色问题
- 数据结构:区域染色问题
- 染色问题的算法
- 算法马拉松18-A-染色问题
- 染色问题
- 染色问题
- 图像处理:染色
- 数据结构及算法-何谓数据结构
- 【数据结构和算法分析】循环链表及约瑟夫问题
- 算法与数据结构-回溯法及八皇后问题求解
- 算法与数据结构-分治法及汉诺塔问题求解
- 数据结构及算法综述
- 数据结构及算法
- 数据结构及算法
- 算法及数据结构(下)
- 数据结构及算法序言
- 常用数据结构及算法
- poj 2828 Buy Tickets
- 人生会重复,也会循环
- STL学习笔记(三) 堆的操作
- Qt XML读取写入操作
- nefu485分配问题(二分图的最佳匹配)
- 【数据结构及算法】2.图像染色问题
- SQL Server建立用户并分配权限
- 多表处理(四)-函数
- 用C#编程修改Word模版
- WinJS.Class 初探
- Windows程序设计的三本经典的书籍
- 笔试题四+答案
- 原型模式
- 开始使用华丽的Ubuntu12