暴力枚举+剪枝
参考:https://blog.csdn.net/DERITt/article/details/51130372
AC代码:
//暴力枚举+剪枝
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 5005;
bool vis[N][N];
struct node {
int x, y;
}p[N];
int cmp(node a, node b) {//从上到下,从左到右
return a.y == b.y ? a.x < b.x : a.y < b.y;
}
int main() {
int r, c,n;
cin >> r >> c;
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> p[i].x >> p[i].y;
vis[p[i].x][p[i].y] = 1;
}
sort(p + 1, p + 1 + n, cmp);
int ans = 0,dx,dy,tmpx,tmpy;
for (int i = 1; i <= n; i++) {//起点
for (int j = i + 1; j <= n; j++) {
dx = p[j].x - p[i].x;//步长
dy = p[j].y - p[i].y;
//起点不在网格外,剪枝
if (p[i].x - dx > 0 && p[i].x - dx <= r && p[i].y - dy > 0 && p[i].y - dy <= c)
continue;
int cnt = 2;
tmpx = p[j].x + dx;
tmpy = p[j].y + dy;
while (tmpx >= 1 && tmpx <= r && tmpy >= 1 && tmpy <= c) {
if (vis[tmpx][tmpy])//被压倒的稻草
cnt++;
else {//终点在网格内,路径中断,剪枝
cnt = 0;
break;
}
tmpx += dx;
tmpy += dy;
}
if (cnt >= 3)
ans = max(ans, cnt);
}
}
cout << ans << endl;
return 0;
}