zoukankan      html  css  js  c++  java
  • POJ1009Edge Detection

    转载请注明出处:優YoU   http://user.qzone.qq.com/289065406/blog/1311227000

    大致题意:

    某种卫星使用一种叫做“run length encoding”的方式来储存大尺寸图片,

    有一种简单的 edge detection 算法 是将 图像中的每一个点的值与他周围的八个点相减,然后记录下绝对值最大的,上面的右图是左图经过这种算法转换之后的结果。

    现在你的任务就是实现这个算法,输入的图片是以 run length encoding 的形式表示的,同时也要求转换后的图片也以 run length encoding 的形式表示。

     

    解题思路:

    非常令人纠结的模拟题,

    由于图片宽度可能为10^9,因此不能开数组,会MLE

    又因为像素点很多,不能直接暴力,会TLE

     

    突破点在于Inputpairpair上限只有1000,数据量是最少的,因此只能利用这点去解题。

    要利用pair,就必须懂得“跳跃式编码”,就是说只在像素发生变化的位置进行编码,而像素没有变化的位置则其编码值与其左边的像素一致。

     

    我只说解题方法,不给证明了。

    先给所有像素点pix顺序标号pos,从1开始,以这个标号pos作为该像素点pix的索引

    利用pos去模拟pix在二维图片的坐标row=(pos-1)/widthcol=(pos-1)%width

    这样就无需定义二维数组,仅仅虚构了一个二维数组,就解决了空间溢出MLE的问题

     

    接下来在 像素发生变化的位置(下面称为“边界”)的地方 编码

    边界位置其实就是每对pair的个数决定的,对边界位置及其周遭共9个像素点编码,把编码结果及对应的索引pos都存放在OutMap,编码方法就是题目给出的算法

    最后把OutMap中的编码值根据其索引值进行升序排序,依次读取OutMap中的编码值,当编码值code发生变化时,则用 变化后的编码索引 减去 变化前的编码索引,就是codeOutMap中出现的次数。

     

     

    Source修正:

    Mid-Central USA 2000

    http://mcpc.cigas.net/archives/2000/browse.html

     

      1 //Memory Time 
    2 //332K 32MS
    3
    4 #include<iostream>
    5 #include<cmath>
    6 #include<algorithm>
    7 using namespace std;
    8
    9 const int size=1000; //每幅图片的pair上限
    10 int width; //Map的宽
    11 int total=0; //像素点总个数
    12
    13 typedef class OutMapPix
    14 {
    15 public:
    16 int pos; //OutMap中每个像素点的顺序位置,pos从1开始
    17 int code; //OutMap中每个像素点对应InMap的编码
    18 }Pix;
    19
    20 int InMapPair[size][2]; //InMapPair[][0]为像素值,InMapPair[][1]为InMapPair[][0]连续出现的个数
    21 Pix OutMap[size*8]; //每个pix都依赖其周围的8个点编码
    22
    23 int cmp(const void* a,const void* b); //快排比较规则
    24 int GetValue(int pos); //返回第pos个像素点的像素值
    25 int GetCode(int pos); //返回第pos个像素点的编码
    26
    27 int main(int k)
    28 {
    29 while(cin>>width && width)
    30 {
    31 int pairv,pairt;
    32 k=total=0;
    33 while(cin>>pairv>>pairt && pairt)
    34 {
    35 InMapPair[k][0]=pairv;
    36 InMapPair[k++][1]=pairt;
    37 total+=pairt;
    38 }
    39 int PairNum=k; //pair的个数
    40
    41 cout<<width<<endl;
    42
    43 int pos=1; //当前处理的像素点的位置
    44 k=0; //OutMap[]指针
    45 for(int p=0;p<=PairNum;p++)
    46 {
    47 int row=(pos-1)/width; //得到pos在二维图对应的坐标
    48 int col=(pos-1)%width;
    49
    50 for(int i=row-1;i<=row+1;i++) //枚举(row,col)周围及其自身共9个点(x,y)
    51 for(int j=col-1;j<=col+1;j++)
    52 {
    53 int tpos=i*width+j; //得到(x,y)的顺序位置
    54
    55 if(i<0 || j<0 || j>=width || tpos>=total)
    56 continue;
    57
    58 OutMap[k].pos=tpos+1;
    59 OutMap[k++].code=GetCode(tpos+1); //对发生变化的像素点的附近8个点编码
    60 }
    61
    62 pos+=InMapPair[p][1]; //跳跃,确定下一个像素发生变化的点的位置
    63 }
    64
    65 qsort(OutMap,k,sizeof(Pix),cmp); //对OutMap根据顺序位置
    66
    67 /*OutPut*/
    68
    69 Pix temp=OutMap[0];
    70 for(int i=0;i<k;i++)
    71 {
    72 if(temp.code==OutMap[i].code)
    73 continue;
    74 cout<<temp.code<<' '<<OutMap[i].pos-temp.pos<<endl;
    75 temp=OutMap[i];
    76 }
    77 cout<<temp.code<<' '<<total-temp.pos+1<<endl;
    78 cout<<"0 0"<<endl;
    79
    80 }
    81 cout<<0<<endl;
    82
    83 return 0;
    84 }
    85
    86
    87 /*快排比较规则*/
    88 int cmp(const void* a,const void* b)
    89 {
    90 Pix* x=(Pix*)a;
    91 Pix* y=(Pix*)b;
    92 return x->pos - y->pos;
    93 }
    94
    95 /*返回第pos个像素点的像素值*/
    96 int GetValue(int pos)
    97 {
    98 int i=0,p=0;
    99 while(p<pos)
    100 p+=InMapPair[i++][1];
    101
    102 return InMapPair[i-1][0];
    103 }
    104
    105 /*返回第pos个像素点的编码*/
    106 int GetCode(int pos)
    107 {
    108 int code=GetValue(pos);
    109 int MaxAbs=0;
    110
    111 int row=(pos-1)/width;
    112 int col=(pos-1)%width;
    113
    114 for(int i=row-1;i<=row+1;i++)
    115 for(int j=col-1;j<=col+1;j++)
    116 {
    117 int tpos=i*width+j;
    118
    119 if(i<0 || j<0 || j>=width || tpos>=total || tpos==pos-1) //tpos==pos-1为中心的像素点,即当前待编码的点
    120 continue;
    121
    122 int tcode=GetValue(tpos+1);
    123
    124 if(MaxAbs<abs(tcode-code)) //注意取绝对值
    125 MaxAbs=abs(tcode-code);
    126 }
    127
    128 return MaxAbs;
    129 }

    Sample Input

    3
    255 1
    10 1
    255 2
    10 1
    255 2
    10 1
    255 1
    0 0
    10
    35 500000000
    200 500000000
    0 0
    7
    15 4
    100 15
    25 2
    175 2
    25 5
    175 2
    25 5
    0 0
    8
    4 8
    1 1
    2 1
    4 1
    8 1
    6 1
    4 1
    2 1
    0 1
    0 0
    8
    1 1
    2 1
    4 1
    8 1
    6 1
    4 1
    2 1
    0 1
    1 1
    2 1
    4 1
    8 1
    6 1
    4 1
    2 1
    0 1
    0 0
    8
    1 1
    2 1
    4 1
    8 1
    6 1
    4 1
    2 1
    0 1
    0 0
    5
    15 12
    100 3
    15 1
    100 4
    15 2
    100 3
    0 0
    30
    10 41
    20 41
    15 41
    30 41
    25 41
    0 5
    0 0
    1
    255 2
    0 0
    10
    4 20
    6 20
    0 0
    1
    4 1000000000
    0 0
    1000000000
    4 1000000000
    0 0
    30
    10 41
    20 41
    15 41
    30 41
    25 41
    0 5
    0 0
    8
    1 1
    2 1
    4 1
    8 1
    6 1
    4 1
    2 1
    0 1
    1 1
    2 1
    4 1
    8 1
    6 1
    4 1
    2 1
    0 1
    1 1
    2 1
    4 1
    8 1
    6 1
    4 1
    2 1
    0 1
    0 0
    8
    1 1
    2 1
    4 1
    8 1
    6 1
    4 1
    2 1
    0 1
    4 8
    0 0
    8
    4 8
    1 1
    2 1
    4 1
    8 1
    6 1
    4 1
    2 1
    0 1
    5 8
    0 0
    5
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    30 11
    20 11
    10 11
    20 11
    0 0
    0
    

    Sample Output

    3
    245 9
    0 0
    10
    0 499999990
    165 20
    0 499999990
    0 0
    7
    85 5
    0 2
    85 5
    75 10
    150 2
    75 3
    0 2
    150 2
    0 4
    0 0
    8
    3 2
    4 3
    2 1
    4 2
    3 1
    2 1
    4 2
    2 3
    4 1
    0 0
    8
    1 1
    2 1
    4 2
    2 4
    1 1
    2 1
    4 2
    2 4
    0 0
    8
    1 1
    2 1
    4 2
    2 4
    0 0
    5
    0 6
    85 12
    0 2
    85 3
    0 2
    0 0
    30
    0 10
    10 62
    5 20
    15 62
    5 20
    25 6
    5 15
    0 9
    25 6
    0 0
    1
    0 2
    0 0
    10
    0 10
    2 20
    0 10
    0 0
    1
    0 1000000000
    0 0
    1000000000
    0 1000000000
    0 0
    30
    0 10
    10 62
    5 20
    15 62
    5 20
    25 6
    5 15
    0 9
    25 6
    0 0
    8
    1 1
    2 1
    4 2
    2 4
    1 1
    2 1
    4 2
    2 4
    1 1
    2 1
    4 2
    2 4
    0 0
    8
    3 1
    2 1
    4 2
    2 3
    4 1
    3 2
    4 3
    2 1
    4 2
    0 0
    8
    3 2
    4 3
    2 1
    4 3
    3 1
    4 2
    2 2
    3 1
    5 1
    4 2
    3 4
    5 2
    0 0
    5
    0 5
    10 10990
    0 5
    0 0
    0
    
  • 相关阅读:
    关于JVM的一些东西
    网络的最大流最小割定理
    类的生命周期
    关于java中的不可变类(转)
    如何在Linux上升级java
    CAS操作
    如何使用fastJson来解析JSON格式数据和生成JSON格式数据
    计算机中如何实现除数是2的幂次的除法【转载自CSDN】
    python:使用Fabric自动化你的任务
    python中的元类
  • 原文地址:https://www.cnblogs.com/lyy289065406/p/2122864.html
Copyright © 2011-2022 走看看