poj1009

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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值