POJ 2812 恼人的青蛙 解题报告
POJ 2812 恼人的青蛙 解题报告
编号:2812
考查点:枚举,优化判断条件
思路:算法是我看得书上的,要注意优化,搜索的时候有很多地方需要优化,例如两点是否是进入稻田的前两点,两点的下一点是否会出现在稻田里,还要注意很多地方,例如qsort和bsearch,否则很容易出现Time Limit Exceed
提交情况: 实现算法后,出现了很多此Time Limit Exceed,后来发现需要判断两点是否是进入稻田的前两点,修改代码后成功AC..
Source Code:
//POJ Grids 2812
#include <iostream>
using namespace std;
struct plant{
int x;
int y;
};
plant p[5001];
int h,l,n;
int compare(const void* e1,const void* e2)
{
if (((*(plant*)e1).x - (*(plant*)e2).x)==0)
{
return (*(plant*)e1).y - (*(plant*)e2).y;
}
else
return (*(plant*)e1).x - (*(plant*)e2).x;
}
int steps(int i,int j,int n)
{
plant temp;
int x,y;
x = p[j].x - p[i].x;
y = p[j].y - p[i].y;
temp.x = p[j].x+x;
temp.y = p[j].y+y;
int count = 1;
while (++count)
{
if (!bsearch(&temp,p,n,sizeof(plant),compare))
{
if (temp.x>h||(temp.y<1||temp.y>l))
{
return count;
}
return -1;
}
temp.x += x;
temp.y += y;
}
}
int main()
{
scanf("%d %d",&h,&l);
scanf("%d",&n);
for (int i=0;i<n;i++)
{
scanf("%d %d",&p[i].x,&p[i].y);
}
qsort(p,n,sizeof(plant),compare);
int max = 2;
for (int i=0;i<n-2;i++)
{
for (int j=i+1;j<n-1;j++)
{
//optimize
int x,y;
x = p[j].x - p[i].x;
y = p[j].y - p[i].y;
if (p[i].x-x>=1&&(p[i].y-y<=l&&p[i].y-y>=1))
continue;
if (p[i].x+max*x>h)
break;
if (p[i].y+max*y>l||p[i].y+max*y<1)
continue;
int temp = steps(i,j,n);
if (temp>max)
{
max = temp;
}
}
}
if (max>=3)
cout<<max<<endl;
else
cout<<"0"<<endl;
return 0;
}
总结:要先读代码,出现了很多次把temp.x写成了temp.y的低级错误。寄希望于visual assist只会犯下更隐蔽的错误.。
By Ns517
Time