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、付费专栏及课程。

余额充值