标签:
在一定大小的像素图像中,将同色区域的颜色值替换为其他颜色值,从而产生新的图像,输入数据,图像大小,指定的像素点坐标,要替换成的颜色。
一开始出队操作写错了折腾半天,当队列中只有一个元素是出队后要将队首指针指向队尾指针。
取定初始位置的坐标后,在此位置上下左右搜索,将满足要求的位置入队,然后经过此一层循环后,取出队首元素,替换颜色,然后再根据该点上下左右搜索。
1 #include <iostream> 2 #include <cstdlib> 3 using namespace std; 4 struct point 5 { 6 int x; 7 int y; 8 }; 9 struct squeue 10 { 11 point data; 12 squeue *next; 13 }; 14 struct sq 15 { 16 squeue *front; 17 squeue *rear; 18 }; //坐标 19 void initqueue(sq *s) /*队列初始化*/ 20 { 21 squeue *q; 22 q=new squeue; /*设定队列头部*/ 23 s->front=q; 24 s->rear=q; 25 q->next=NULL; 26 } 27 int isempty(sq *s) 28 { 29 if(s->front==s->rear) 30 return 1; 31 return 0; 32 } 33 int enqueue(sq *s,point e) 34 { 35 squeue *q; 36 q=new squeue; 37 q->data=e; 38 q->next=NULL; 39 s->rear->next=q; 40 s->rear=q; 41 } 42 int ouqueue(sq *s,point &e) 43 { 44 if(isempty(s)) 45 return 0; 46 else 47 { 48 squeue* p=(s->front)->next; 49 e=p->data; 50 s->front->next=p->next; 51 if(s->rear==p) //当要删除的是队尾元素时,要将队尾指针指向队首指针 52 s->rear=s->front; 53 free(p); 54 return 1; 55 } 56 } 57 void pixel_transform(int a[][5],int m,int n,int x0,int y0,int newcolor) 58 { 59 sq s; 60 initqueue(&s); 61 point q,temp; 62 int c=a[x0][y0]; /*取出旧的颜色*/ 63 q.x=x0,q.y=y0; 64 enqueue(&s,q); 65 while(isempty(&s)==0) 66 { 67 ouqueue(&s,temp); 68 q=temp; 69 a[q.x][q.y]=newcolor; 70 if(q.x-1>=0&&a[q.x-1][q.y]==c) 71 { 72 temp.x=q.x-1; 73 temp.y=q.y; 74 enqueue(&s,temp); 75 } 76 if(q.x+1<=m-1&&a[q.x+1][q.y]==c) 77 { 78 temp.x=q.x+1; 79 temp.y=q.y; 80 enqueue(&s,temp); 81 } 82 if(q.y-1>=0&&a[q.x][q.y-1]==c) 83 { 84 temp.x=q.x; 85 temp.y=q.y-1; 86 enqueue(&s,temp); 87 } 88 if(q.y+1<=n-1&&a[q.x][q.y+1]==c) 89 { 90 temp.x=q.x; 91 temp.y=q.y+1; 92 enqueue(&s,temp); 93 } 94 } 95 } 96 int main() 97 { 98 int i,j; 99 int a[5][5]={ 100 1,5,0,1,0, 101 0,0,0,0,0, 102 0,0,2,3,0, 103 2,0,0,2,0, 104 9,2,0,0,0 105 }; 106 pixel_transform(a,5,5,1,2,6); 107 for(i=0;i<5;i++) 108 { 109 for(j=0;j<5;j++) 110 cout<<a[i][j]<<‘ ‘; 111 cout<<endl; 112 } 113 return 0; 114 }
标签:
原文地址:http://www.cnblogs.com/a1225234/p/4673018.html