‘’
题目意思和思路参见小you的博客
这题花了我好久时间。。。
纠正了无数个错误后,发现数组也开小了- -
数组一改大就成功了,然后开始逐步删去没用的代码,最终还是这么冗长。
难度在于创建这个特殊的数据结构,以及编码的处理
题目思路就是连续编码
只计算边界处那2个点的周围九个点,以及其自身即可
都放入ans数组
然后按位置大小从小到大排序
检测是否有前后不等的情况
如果有,判断是否在同一行
在同一行的话,很简单
不在同一行的话,位置小那个点的左边和右边都是他自身
具体见代码
不知道多年后自己还能不能看得懂- -
#include<stdio.h>
#include<string.h>
#include<math.h>
#define M 20000
int cp[9];
int wid,k,sum;
int value[M],value_num[M];
int put_ans_value[M],put_ans_num[M];
struct new_pic
{
int new_value;
int place;
};
struct new_pic ans[M];
void get_new_cp()
{
int i;
if(wid==1)
{
for(i=2;i<9;i++)
cp[i]=0;
cp[0]=-1;
cp[1]=1;
return ;
}
cp[0]=(-1)*wid-1;
cp[1]=(-1)*wid;
cp[2]=(-1)*wid+1;
cp[3]=-1;
cp[4]=0;
cp[5]=1;
cp[6]=wid-1;
cp[7]=wid;
cp[8]=wid+1;
}
int find_value(int p)
{
int pp=0,i=0;
while(pp<p)
{
pp+=value_num[i];
i++;
}
return value[i-1];
}
int judge(int p,int i)
{
if(wid==1)
if(i==0||i==1)
if(p+cp[i]<=0||p+cp[i]>=sum)
return 0;
else return 1;
if(i==4)
return 0;
if(p+cp[i]<=0)
return 0;
if(p%wid==0)
if(i%3==2)
return 0;
if(p%wid==1)
if(i%3==0)
return 0;
if(p+cp[i]>=sum)
return 0;
return 1;
}
int get_value(int p)
{
int pp=p,max=0,cha,i,v;
v=find_value(p);
for(i=0;i<9;i++)
{
pp=p+cp[i];
if(judge(p,i)==0)
continue;
cha=abs(v-find_value(pp));
if(cha>max)
max=cha;
}
return max;
}
void main()
{
int i,j,a,b,p,pos,v,p_value,kk=0,pp;
struct new_pic temp;
while(scanf("%d",&wid),wid!=0)
{
k=kk=0;
sum=1;
get_new_cp();
while(scanf("%d%d",&a,&b),b!=0)
{
value[k]=a;
value_num[k]=b;
sum+=b;
k++;
}
pos=1;
ans[0].new_value=value[0];
for(j=0;j<k;j++)
{
v=value[j];
p=pos;
for(i=0;i<9;i++)
{
p=pos+cp[i];
if(judge(pos,i)==1)
{
p_value=get_value(p);
ans[kk].new_value=p_value;
ans[kk].place=p;
kk++;
}
}
pp=pos-1;
if(pp!=0)
for(i=0;i<9;i++)
{
p=pp+cp[i];
if(judge(pos-1,i)==1)
{
p_value=get_value(p);
ans[kk].new_value=p_value;
ans[kk].place=p;
kk++;
}
}
pos+=value_num[j];
}
pos=sum-1;
for(i=0;i<9;i++)
{
p=pos+cp[i];
if(judge(pos,i)==1)
{
p_value=get_value(p);
ans[kk].new_value=p_value;
ans[kk].place=p;
kk++;
}
}
for(i=0;i<kk;i++)
for(j=i;j<kk;j++)
{
if(ans[i].place>ans[j].place)
{
temp=ans[i];
ans[i]=ans[j];
ans[j]=temp;
}
}
printf("%d\n",wid);
pos=1;
v=ans[0].new_value;
k=0;
for(i=0;i<kk-1;i++)
{
if(ans[i].new_value!=ans[i+1].new_value)
{
if((ans[i].place-1)/wid==(ans[i+1].place-1)/wid)
{
put_ans_num[k]=ans[i+1].place-pos;
pos=ans[i+1].place;
}
else
{
put_ans_num[k]=((ans[i+1].place-1)/wid)*wid+1-pos;
pos=((ans[i+1].place-1)/wid)*wid+1;
}
put_ans_value[k]=v;
k++;
v=ans[i+1].new_value;
}
}
put_ans_value[k]=v;
put_ans_num[k]=sum-pos;
for(i=0;i<=k;i++)
printf("%d %d\n",put_ans_value[i],put_ans_num[i]);
printf("0 0\n");
}
printf("0\n");
}