北大ACM(POJ1009-Edge Detection)

Question:http://poj.org/problem?id=1009
问题点:RLE编码。
 1 Memory: 648K        Time: 547MS
 2 Language: C++        Result: Accepted
 3 
 4 #include <iostream>
 5 #include <cstdlib>
 6 #include <map>
 7 #include <vector>
 8 using namespace std;
 9 
10 map<int,int> mp;
11 map<int,int> omp;
12 map<int, int>::iterator mp_Iter;
13 map<int, int>::iterator omp_Iter;
14 vector<int> st;
15 static int around[8][2]={{-1,-1},{-1,0},{-1,1},{0,-1},{0,1},{1,-1},{1,0},{1,1}};
16 int getValue(int index)
17 {
18     int value=0;
19     for(mp_Iter = mp.begin(); mp_Iter != mp.end(); mp_Iter++)
20     {
21         if(index<mp_Iter->first) break;
22         value=mp_Iter->second;
23     }
24     return value;
25 }
26 int getMax(int index,int width,int count)
27 {
28     int center=getValue(index);
29     int h=index/width;
30     int max=0;
31     for(int i=0;i<8;i++)
32     {
33         int sub=index+around[i][0]*width+around[i][1];
34         if(h+around[i][0]==sub/width && sub>=0 && sub<count)
35         {
36             int a=getValue(sub);
37             max=abs(center-a)>max?abs(center-a):max;
38         }
39     }
40     return max;
41 }
42 void process(int width,int count)
43 {
44     for(int i=0; i < st.size(); i++)
45     {
46         int index=st.at(i);
47         omp.insert(pair<int,int>(index,getMax(index,width,count)));
48     }
49 }
50 int main()
51 {
52     int width;
53     while(cin>>width && cout<<width<<endl && width)
54     {
55         mp.clear();
56         omp.clear();
57         st.clear();
58         int v,l,count=0;
59         while(cin>>v>>l && l){//v有可能为0
60             mp.insert(pair<int,int>(count,v));
61             count+=l;
62         }
63         for(mp_Iter = mp.begin(); mp_Iter != mp.end(); mp_Iter++)
64         {
65             for(int i=-1;i<2;i++)
66             {
67                 for(int j=-1;j<2;j++)
68                 {
69                     int index=mp_Iter->first+i*width+j;
70                     if(index>=0 && index <count)
71                         st.push_back(index);
72                 }
73             }
74         }
75         st.push_back(width);
76         st.push_back(count-width);
77         process(width,count);
78         
79         omp_Iter = omp.begin();
80         int st=omp_Iter->first;
81         int val=omp_Iter->second;
82         omp_Iter++;
83         for(;omp_Iter != omp.end(); omp_Iter++)
84         {
85             if(omp_Iter->second != val)
86             {
87                 cout<<val<<" "<<omp_Iter->first-st<<endl;
88                 st=omp_Iter->first;
89                 val=omp_Iter->second;
90             }
91         }
92         cout<<val<<" "<<count-st<<endl;
93         cout<<"0 0"<<endl;
94     }
95     return 0;
96 }
 
 

 

 

转载于:https://www.cnblogs.com/TYcnblogs/p/poj1009.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值