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 }