zoukankan      html  css  js  c++  java
  • 像素转换问题-队列解决办法(或者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 }
  • 相关阅读:
    全面分析C#方法中的ref和out
    SQL注入漏洞全接触入门篇
    如何使用四个语句来提高 SQL Server 的伸缩性
    5种提高SQL性能的方法
    SQL注入漏洞全接触高级篇
    网络游戏程序员须知 收包与发包
    SQL注入攻击的原理及其防范措施
    SQL注入漏洞全接触进阶篇
    C#委托的故事
    转眼又快一年了,最近没赚钱,在学习FLASH as3编程
  • 原文地址:https://www.cnblogs.com/a1225234/p/4673018.html
Copyright © 2011-2022 走看看