读完这道题,就有一种不妙的感觉。因为编写这种处理格子的问题,或者说处理不规则数据的问题,我写的代码从来都是总体思路也对,但是一大堆bug,结果不对。很痛苦。
硬着头皮写一写这个题,果然是很蛋疼。
哎,这种处理不规则数据的题最是考验清晰的思维能力和编程的内功。可怜自己思维也不够清晰,编程内功也不行,只要一超过100行,就bug一大堆。苦恼。
粘上未完成的代码,哪天闲了(或许再也不)写吧。
呵呵 本来都不想改这道题了,但是看书的时候突然感觉能改好,就随便改一下。 改完之后,用论坛里的数据测试一下,跟人家的结果不一样。很郁闷。 抱着提交一下算了,死了也甘心的态度,提交了一下。
没想到的是,一次提交AC~!
而且是172KB,16ms. 哎 太出人意料了。
贴代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define row_num (box_num/width)
const int NUM=1005;
int data[NUM][2];
const int dir[8][2]={{-1,-1},{-1,0},{-1,+1},{0,-1},{0,1},{+1,-1},{+1,0},{+1,+1}};
int num;
int width;
int box_num;
int getValue(int index,int i,int j)
{
if(index<0)
{
while(index)
{
if(j>0)
{
j--;
index++;
}
else if(j==0)
{
i--;
if(i<0)
return -1;
j=data[i][1];
}
}
}
else if(index>0)
{
while(index)
{
if(j<data[i][1]-1)
{
j++;
index--;
continue;
}
else if(j==data[i][1]-1)
{
i++;
if(i==num)
return -1;
j=0;
index--;
}
}
}
return data[i][0];
}
bool isLegal(int pos,int k)
{
int row=pos/width;
int col=pos%width;
if(row+dir[k][0]>=0&&row+dir[k][0]<row_num&&col+dir[k][1]>=0&&col+dir[k][1]<width)
return true;
return false;
}
void solve()
{
int count=0;
int last_max=-1;
int pos=0;
for(int i=0;i<num;i++)
{
for(int j=0;j<data[i][1];j++,pos++)
{
int max=-1;
for(int k=0;k<8;k++)
{
if(isLegal(pos,k)==false)
continue;
int index=dir[k][0]*width+dir[k][1]; //相对于自己的下标偏移值
int value=getValue(index,i,j);
if(value!=-1)
{
if(value-data[i][0]>max)
max=value-data[i][0];
else if(data[i][0]-value>max)
max=data[i][0]-value;
//printf("value dif %d %d %d\n",i,data[i][0],value);
}
}
if(data[i][1]>1000&&pos-2*width>pos-j && pos+2*width<pos-j+data[i][1])
{
int det=data[i][1]-2*width-j;
pos+=det-1;
count+=det;
j+=det-1;
continue;
}
if(last_max==-1)
{
last_max=max;
count++;
}
else if(last_max==max)
{
count++;
}
else if(last_max!=max)
{
printf("%d %d\n",last_max,count);
count=1;
last_max=max;
}
}
}
printf("%d %d\n",last_max,count);
}
int main()
{
freopen("input.txt","r",stdin);
int value,n;
while(scanf("%d",&width)!=EOF)
{
printf("%d\n",width);
if(width==0)
break;
num=0;
box_num=0;
while(scanf("%d %d",&value,&n)&&(value!=0||n!=0))
{
data[num][0]=value;
data[num++][1]=n;
box_num+=n;
}
if(num==1)
printf("0 %d\n",data[0][1]);
else
solve();
printf("0 0\n");
}
return 0;
}