AOJ_0518 The Oldest Site

問題
解法
2点を選んで1つの辺を作る.
その辺が正方形をつくっているか調べるといい.

#include <cstdio>
#include <algorithm>
using namespace std;

const int MAX_HW = 5001;
bool iseki[MAX_HW][MAX_HW];
int x[3000], y[3000];
int main(){
	int n;
	while(scanf("%d", &n) && n){
		for(int i = 0; i < MAX_HW; i++)
			for(int j = 0; j < MAX_HW; j++)
				iseki[i][j] = false;
		for(int i = 0; i < n; i++){
			scanf("%d %d", &x[i], &y[i]);
			iseki[x[i]][y[i]] = true;
		}
		int ans = 0;
		for(int i = 0; i < n; i++){
			for(int j = i + 1; j < n; j++){
				int dx = x[i] - x[j];
				int dy = y[i] - y[j];
				if(x[i] - dy < 0 || MAX_HW <= x[i] - dy ||
				   y[i] + dx < 0 || MAX_HW <= y[i] + dx ||
				   x[j] - dy < 0 || MAX_HW <= x[j] - dy ||
				   y[j] + dx < 0 || MAX_HW <= y[j] + dx ){
				   continue;}
				if(iseki[x[i] - dy][y[i] + dx] && iseki[x[j] - dy][y[j] + dx]){
					ans = max(ans, dx * dx + dy * dy);
				}
			}
		}
		printf("%d\n", ans);
	}
	return 0;
}