您的位置:首页 > 其它

POJ1054-The Troublesome Frog

2016-10-21 17:51 393 查看
两点确定一条直线,所以枚举两个点即可。

#include <cstdio>
#include <algorithm>

using namespace std;

typedef pair<int, int> P;

const int maxn = 5000 + 5;

P flat[maxn];

int r, c, n;

int search(int x, int y, int dx, int dy) {
int cnt = 2;
int nx = x + dx;
int ny = y + dy;
while (nx >= 1 && nx <= r && ny >= 1 && ny <= c) {
if (!binary_search(flat, flat + n, P(nx, ny))) {
return 0;
}
cnt++;
nx += dx;
ny += dy;
}
return cnt;
}

int main(int argc, char const *argv[]) {
scanf("%d%d", &r, &c);
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d%d", &flat[i].first, &flat[i].second);
}
sort(flat, flat + n);

int ans = 2;
for (int i = 0; i < n - 2; i++) {
for (int j = i + 1; j < n - 1; j++) {
int dx = flat[j].first - flat[i].first;
int dy = flat[j].second - flat[i].second;
int tx = flat[i].first - dx;
int ty = flat[i].second - dy;
if (tx >= 1 && tx <= r && ty >= 1 && ty <= c) {
continue;
}
if (flat[i].first + ans * dx > r) {
break;
}
if (flat[i].second + ans * dy > c) {
continue;
}
int cnt = search(flat[j].first, flat[j].second, dx, dy);
ans = max(ans, cnt);
}
}
if (ans <= 2) {
ans = 0;
}
printf("%d\n", ans);

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: