描述
样例输入
6 7
14
2 1
6 6
4 2
2 5
2 6
2 7
3 4
6 1
6 2
2 3
6 3
6 4
6 5
6 7
样例输出
7
代码
#include<bits/stdc++.h>
using namespace std;
int r,c,n,ans;
int a[5005][5005];
int record[5005][5005];
struct node{
int x,y;
bool operator<(const node&p) const
{
if(x!=p.x) return x<p.x;
return y<p.y;
}
}b[5005];
bool judge(int t,int z)
{
return t>=1&&t<=r&&z>=1&&z<=c;
}
int main()
{
cin>>r>>c;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>b[i].x>>b[i].y;
record[b[i].x][b[i].y]=true;
}
sort(b,b+n);
for(int i=0;i<n;i++)
{
for(int j=i+1;j<n;j++)
{
int dx=b[j].x-b[i].x;
int dy=b[j].y-b[i].y;
if(judge(b[i].x-dx,b[i].y-dy)) continue;//剪枝,i这个点必须是一条路径的第一个
int xx=b[j].x+dx;
int yy=b[j].y+dy;
if(!judge(xx,yy)) continue;//剪枝
int cnt=2;
while(judge(xx,yy))
{
if(record[xx][yy]) cnt++;
else{
cnt=0;break;
}
xx+=dx;
yy+=dy;
}
ans=max(cnt,ans);
}
}
cout<<ans<<endl;
return 0;
}
剪枝+搜索,题目时间限制比较长,不会超时