您的位置:首页 > 其它

成长轨迹55 【ACM算法之路 百炼poj.grids.cn】【简单枚举】【2812:恼人的青蛙】

2012-02-22 17:42 507 查看
题目http://poj.grids.cn/practice/2812

打错字母的伤不起啊。。。
【wa代码】

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int r,c,n;
struct point
{
int x;
int y;
}plants[5050];

int cmp(const void *a,const void *b)
{
point * a1=(struct point*)a;
point * b1=(struct point*)b;
if(a1->x==b1->x)
return (a1->y - b1->y);
else
return (a1->x - b1->x);
}

int deal(point p,int dx,int dy)
{
point temp;
temp.x=p.x+dx;
temp.y=p.y+dy;
int step=2;

//之前下面思路错了
//如果在地图中找不到明明在地图中应该出现的点
//那么就不是符合要求路径了,那就不应该有长度
while(temp.x>0&&temp.x<=r&&temp.y>0&&temp.y<=c)
{
if(!bsearch(&temp,plants,n,sizeof(point),cmp))
{
step=0;
break;
}
step++;
temp.x+=dx;
temp.y+=dy;

}
//if(step==2) 这里不用做处理,反正后面出来会判断
//step=0;
return step;
}
int main()
{
scanf("%d %d",&r,&c);
//【注意这里各个格子不是从0开始的,也不是在r-1和c-1结束】
int max=2;
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d %d",&plants[i].x,&plants[i].y);
qsort(plants,n,sizeof(point),cmp);
for(int i=0;i<n-1;i++)
for(int j=i+1;j<n;j++)
{
int dx,dy;
dx=plants[j].x-plants[i].x;
dy=plants[j].y-plants[i].y;
point p;
p.x=plants[i].x-dx;
p.y=plants[i].y-dy;
if(p.x>=1&&p.x<=r&&p.y>=1&&p.y<=r)
continue;
p.x=plants[i].x+max*dx;
p.y=plants[i].y+max*dy;
if(p.x>r||p.x<=0||p.y>c||p.y<=0)
continue;

int step=deal(plants[j],dx,dy);
if(step>max)
max=step;
}
if(max==2)
max=0;
printf("%d",max);
return 0;
}


【ac代码】

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int r,c,n;
struct point
{
int x;
int y;
}plants[5050];

int cmp(const void *a,const void *b)
{
point * a1=(struct point*)a;
point * b1=(struct point*)b;
if(a1->x==b1->x)
return (a1->y - b1->y);
else
return (a1->x - b1->x);
}

int deal(point p,int dx,int dy)
{
point temp;
temp.x=p.x+dx;
temp.y=p.y+dy;
int step=2;

//之前下面思路错了
//如果在地图中找不到明明在地图中应该出现的点
//那么就不是符合要求路径了,那就不应该有长度
while(temp.x>0&&temp.x<=r&&temp.y>0&&temp.y<=c)
{
if(!bsearch(&temp,plants,n,sizeof(point),cmp))
{
step=0;
break;
}
step++;
temp.x+=dx;
temp.y+=dy;

}
//if(step==2) 这里不用做处理,反正后面出来会判断
//step=0;
return step;
}
int main()
{
scanf("%d %d",&r,&c);
//【注意这里各个格子不是从0开始的,也不是在r-1和c-1结束,而分别是1、r和c】
int max=2;
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d %d",&plants[i].x,&plants[i].y);
qsort(plants,n,sizeof(point),cmp);
for(int i=0;i<n-1;i++)
for(int j=i+1;j<n;j++)
{
int dx,dy;
dx=plants[j].x-plants[i].x;
dy=plants[j].y-plants[i].y;
point p;
p.x=plants[i].x-dx;
p.y=plants[i].y-dy;
if(p.x>=1&&p.x<=r&&p.y>=1&&p.y<=c)//【这里怎么打成p.y<=r了。。】
continue;
p.x=plants[i].x+max*dx;
p.y=plants[i].y+max*dy;
if(p.x>r||p.x<=0||p.y>c||p.y<=0)
continue;

int step=deal(plants[j],dx,dy);
if(step>max)
max=step;
}
if(max==2)
max=0;
printf("%d\n",max);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐