数据结构中图像染色

qq_34007964 2016-02-18 12:54:50
假设以二维数组g(1..m,1..n)表示一个图像区域,g[i,j]表示该区域中点(i,j)所具有的颜色,其值为从0到k的整数.编写算法置换点(i0,j0)所在区域的颜色.约定和(i0,j0)同色的上下左右的邻接点为同色区域的点. ,运行结果为什么这样(见图片),求指教。

//这是cpp文件
#include<stdio.h>
#include"chang_color.h"
#define m_max 50
#define n_max 50
int main()
{
int i,j,m,n,i0,j0,new_color;
printf("输入颜色区域的高度和宽度:");
scanf("%d%d",&m,&n);
int area[m_max+1][n_max+1];
void chang_color(int array[m_max+1][n_max+1],int m,int n,int i0,int j0,int new_color);
printf("\n请输入各点的颜色:\n");
for(i=1;i<=m;i++)
{
for(j=1;j<=n;j++)
{
scanf("%d",&area[i][j]);
}
}
printf("\n输入想改变颜色的点和新颜色值:");
scanf("%d%d%%d",&i0,&j0,&new_color);
chang_color(area,m,n,i0,j0,new_color);
printf("改变颜色后:\n");
for(i=1;i<=m;i++)
{
for(j=1;j<=n;j++)
{
printf("%d\t",area[i][j]);
}
putchar(' ');
}
putchar(' ');
return(0);
}

//这是chang_color.h
#include"stack_function.h"
#include<stdio.h>
#define m_max 50
#define n_max 50
void chang_color(int array[m_max+1][n_max+1],int m,int n,int i0,int j0,int new_color)
{
if(i0<1||i0>m||j0<1||j0>n){ printf("此位置不存在");exit(0);}
int color_init=array[i0][j0],x,y;
Sqstack s;
Initstack(s);
push(s,i0);
push(s,j0);
do
{
pop(s,y);
pop(s,x);
if(x-1>0&&array[x-1][y]==color_init)
{
array[x-1][y]=new_color;
push(s,x-1);
push(s,y);
}
if(y-1>0&&array[x][y-1]==color_init)
{
array[x][y-1]=new_color;
push(s,x);
push(s,y-1);
}
if(x+1<=m&&array[x+1][y]==color_init)
{
array[x+1][y]=new_color;
push(s,x+1);
push(s,y);
}
if(y+1<=n&&array[x][y+1]==color_init)
{
array[x][y+1]=new_color;
push(s,x);
push(s,y+1);
}
}while(!Stackempty(s));
}



//这是我写的栈的操作函数头文件
#include<stdlib.h>
#include<stdio.h>
# define stack_max_size 20
#define stack_increase_size 10
#define ElemType int
typedef struct
{
ElemType *top;
ElemType *base;
int stack_allow_size;
}Sqstack;
void Initstack (Sqstack&s)
{
s.top=s.base=(ElemType*)malloc(stack_max_size*sizeof(ElemType));
if(!s.base)
{
printf("创建栈失败");
exit(0);
}
s.stack_allow_size=stack_max_size;
}
void Destroystack (Sqstack &s)
{
free(s.base);
s.base=NULL;
s.top=NULL;
s.stack_allow_size=0;
}
void Clearstack(Sqstack&s)
{
s.top=s.base;
}
bool Stackempty(Sqstack s)
{
if(s.base==s.top)
return(true);
else return(false);
}
int stacklength(Sqstack s)
{
return(s.top-s.base);
}
void gettop(Sqstack s,ElemType&e)
{
if(s.top==s.base) printf("此栈为空,无法取栈顶元素");
e=*(s.top-1);
}
void push(Sqstack&s,ElemType e)
{
if((s.top-s.base)>=s.stack_allow_size)
{
s.base=(ElemType*)realloc(s.base,(s.stack_allow_size+stack_increase_size)*sizeof(ElemType));
if(!s.base) {printf("空间扩大失败");exit(0);}
s.top=s.base+s.stack_allow_size;
s.stack_allow_size+=stack_increase_size;
}
*s.top++=e;
}
void pop(Sqstack&s,ElemType&e)
{
if(s.top==s.base)
{
printf("此栈为空,删除栈顶元素操作不能进行");
}
else e=*(--s.top);
}
...全文
820 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

1,178

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 数据库及相关技术
社区管理员
  • 数据库及相关技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧