| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
贴一段AC了的代码,32ms根据这里面的某位同学的提示,终于做出来了,写的有点乱,原理是这个样子滴:
http://hi.baidu.com/zdg102/item/66f34342080006ab60d7b9a8
代码:
#include<iostream>
#include<algorithm>
#include"math.h"
using namespace std;
#define MAX 1024
int matrix[8][2] = {{1,0},{1,-1},{0,-1},{-1,-1},{-1,0},{-1,1},{0,1},{1,1}};
int (*image)[3] = new int[MAX][3];
int (*result)[2] = new int[MAX*6][2];
int WIDTH,rows,SIZE;
void print(int (*rs)[2],int n){
for(int i=0;i<n;i++){
cout<<rs[i][0]<<" "<<rs[i][1]<<endl;
}
cout<<"0 0\n";
}
int getcolor(int (*image)[3],int pos){
int i=rows-1;
while(i>=0 && image[i][2]>pos) i--;
return image[i][0];
}
int calnode(int (*image)[3],int *node){
int i,j,c=0,k=0;
for(i=0;i<rows;i++){
c = image[i][2];
node[k++] = c;
node[k++] = c-WIDTH;
node[k++] = c+WIDTH;
if(image[i][1]>1){
c += image[i][1]-1;
node[k++] = c;
node[k++] = c-WIDTH;
node[k++] = c+WIDTH;
}
}
sort(node,node+k);
int ct=-1;
for(j=0;j<k;j++){
if(node[j]<0 || node[j]>=SIZE) continue;
if(ct<0) node[++ct] = node[j];
if(node[j] != node[ct]) node[++ct] = node[j];
}
return ct+1;
}
int cal_one_pixel(int pos){
int i,x,y,max=0,clr,newpos;
int color = getcolor(image,pos);
for(i=0;i<8;i++){
x = matrix[i][0];
y = matrix[i][1];
newpos = pos + x + y*WIDTH;
if(newpos<0 || newpos>=SIZE || (x<0 && ((pos % WIDTH)==0)) || (x>0 && (((pos+1) % WIDTH)==0)))
continue;
clr = getcolor(image,newpos);
if(max<abs(color-clr)) max = abs(color-clr);
}
return max;
}
int caledge(int *node,int n,int (*rs)[2]){
int i,k=0,gap;
for(i=0;i<n-1;i++){
gap = cal_one_pixel(node[i]);
rs[k][0] = gap;
rs[k++][1] = 1;
if((node[i+1]-node[i])<=1) continue;
gap = cal_one_pixel(node[i]+1);
rs[k][0] = gap;
rs[k++][1] = node[i+1]-node[i]-1;
}
gap = cal_one_pixel(node[n-1]);
rs[k][0] = gap;
rs[k++][1] = 1;
int ct=0;
for(i=1;i<k;i++){
if(rs[ct][0] == rs[i][0]) rs[ct][1] += rs[i][1];
else{
rs[++ct][0] = rs[i][0];
rs[ct][1] = rs[i][1];
}
}
return ct+1;
}
int main(){
int *node,nodesize,rssize,start;
//ifstream fcin("ceshi.txt");
int color,num;
//while(fcin>>WIDTH && WIDTH!=0){
while(cin>>WIDTH && WIDTH!=0){
cout<<WIDTH<<endl;
rows = 0;
start = 0;
while(1){
//fcin>>color>>num;
cin>>color>>num;
if(color==0 && num==0) break;
image[rows][0] = color;
image[rows][1] = num;
image[rows][2] = start;
rows++;
start += num;
//cout<<": "<<image[rows-1][0]<<" "<<image[rows-1][1]<<" "<<image[rows-1][2]<<endl;
}
SIZE = start;
nodesize = 6*rows;
node = new int[nodesize];
nodesize = calnode(image,node);
rssize = caledge(node,nodesize,result);
print(result,rssize);
}
cout<<"0\n";
//fcin.close();
system("pause");
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator