poj1009

来源:互联网 发布:h5页面动态软件 编辑:程序博客网 时间:2024/06/06 04:25

  读完这道题,就有一种不妙的感觉。因为编写这种处理格子的问题,或者说处理不规则数据的问题,我写的代码从来都是总体思路也对,但是一大堆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]);elsesolve(); printf("0 0\n");}return 0;}