题意:有一块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; }