题意:有一块r×c的田地,夜晚有一些调皮的青蛙喜欢把田地里的水稻踩扁,于是留下了一串脚印,对于一串脚印,这串脚需满足:1、脚印印在一条直线上;2、使得青蛙是从田地外的一侧;3、脚印数大于等于3求最长的脚印串。
题解:
暴枚+剪纸
排序,枚举两个点,得出跳跃方向和单次长度,暴力跳第二个点
剪纸:如果第一个点不是从外面跳进来的就直接continue
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>
#define ll long long
using namespace std;
const int N = 5010;
int ans,g[N][N];
struct Node {
int x,y;
bool operator < (const Node a) const {
return x==a.x?y<a.y:x<a.x;
}
}p[N];
int gi() {
int x=0,o=1; char ch=getchar();
while(ch!='-' && (ch<'0' || ch>'9')) ch=getchar();
if(ch=='-') o=-1,ch=getchar();
while(ch>='0' && ch<='9') x=x*10+ch-'0',ch=getchar();
return o*x;
}
int main() {
int r=gi(),c=gi(),n=gi();
for(int i=1; i<=n; i++) {
p[i].x=gi(),p[i].y=gi();
g[p[i].x][p[i].y]=1;
}
sort(p+1,p+n+1);
for(int i=1; i<=n; i++)
for(int j=i+1; j<=n; j++) {
int dx=p[j].x-p[i].x,dy=p[j].y-p[i].y,res=0,x,y;
if(p[i].x-dx>=1 && p[i].x-dx<=r && p[i].y-dy>=1 && p[i].y-dy<=c) continue;
x=p[j].x+dx,y=p[j].y+dy;
while(x>=1 && x<=r && y>=1 && y<=c) {
if(!g[x][y]) {res=0;break;}
else res++,x+=dx,y+=dy;
}
ans=max(ans,res);
}
if(ans) printf("%d", ans+2);
else puts("0");
return 0;
}