像素转换问题-队列解决办法(或者dfs)

在一定大小的像素图像中,将同色区域的颜色值替换为其他颜色值,从而产生新的图像,输入数据,图像大小,指定的像素点坐标,要替换成的颜色。

一开始出队操作写错了折腾半天,当队列中只有一个元素是出队后要将队首指针指向队尾指针。

取定初始位置的坐标后,在此位置上下左右搜索,将满足要求的位置入队,然后经过此一层循环后,取出队首元素,替换颜色,然后再根据该点上下左右搜索。

  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 }

 

posted @ 2015-07-24 11:45  御心飞行  阅读(247)  评论(0编辑  收藏  举报