Problem: fightingthezombies (2017 round1)

In the ever-popular role-playing game _Dungeons & Dragons_, or _D&D_, some
wizards enhance their skills by training as geometers, specialist spellcasters
who rely on the inherent magical properties of geometric forms.

Unlike low-level wizards who may be able to fight only a single zombie at a
time, you, the budding geometer, are ready and able to fight medium-sized
hordes!

There are **N** zombies on an infinite 2D plane, with the _i_th one at
coordinates (**Xi**, **Yi**). You have two spells at your disposal, but you
can only cast each one once.

You'll first cast the function-spell `Move(x, y, r, dx, dy)`. Each of its five
parameters can be any real number, though `r` must be positive. Upon
performing this spell, each zombie initially within the circle centered at
coordinates (`x`, `y`) and having radius `r` will have its coordinates
translated by (`dx`, `dy`). In other words, it will have `dx` added to its
x-coordinate, and `dy` added to its y-coordinate. Zombies on the border of the
circle are also affected.

You'll then cast the function-spell `Destroy(x, y)`. Each of its two
parameters can be any real number. Upon performing this spell, each zombie
currently within the axis-aligned square centered at coordinates (`x`, `y`)
and having side-length **R** will be destroyed. Zombies on the border of the
square are also affected.

![]({{PHOTO_ID:336634350719298}}) ![]({{PHOTO_ID:268425761045248}})

What's the largest number of zombies that can be destroyed by this combination
of function-spells?

### Input

Input begins with an integer **T**, the number of zombie hordes you fight. For
each case, there is first a line containing two space-separated integers,
**N** and **R**. Then, **N** lines follow, the _i_th of which contains 2
space-separated integers, **Xi** and **Yi**.

### Output

For the _i_th case, print a line containing "Case #**i**: " followed by the
maximum number of zombies you can slay with your spells.

### Constraints

1 ≤ **T** ≤ 50  
1 ≤ **N** ≤ 50  
0 ≤ **Xi**, **Yi** ≤ 1,000,000,000  
1 ≤ **R** ≤ 1,000,000,000  

It is guaranteed that no two zombies are initially at the same point, though
zombies may later be moved such that there are multiple at the same
coordinates.

### Explanation of Sample

In the first case (shown in the pictures above), one optimal strategy is to
first cast `Move(2.5, 4.5, 2.2, 3, -1)`, moving 4 zombies, and then cast
`Destroy(5.5, 2.5)`, destroying 6 zombies.



Sample input:
5
7 3
1 5
2 3
2 1
5 1
6 3
4 4
4 5
4 1
0 0
0 2
10 0
10 2
4 2
0 0
0 2
10 0
10 2
7 3
8 5
3 6
9 2
4 5
3 2
1 8
2 8
7 6
8 5
3 6
9 2
4 5
3 2
1 8
2 8


Sample output:
Case #1: 6
Case #2: 2
Case #3: 4
Case #4: 6
Case #5: 7



Code: // Hacker Cup 2017
// Round 1
// Fighting the Zombies
// Jacob Plachta

#include <algorithm>
#include <functional>
#include <numeric>
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cmath>
#include <complex>
#include <cstdlib>
#include <ctime>
#include <cstring>
#include <cassert>
#include <string>
#include <vector>
#include <list>
#include <map>
#include <set>
#include <deque>
#include <queue>
#include <stack>
#include <bitset>
#include <sstream>
using namespace std;

#define LL long long
#define LD long double
#define PR pair<int,int>

#define Fox(i,n) for (i=0; i<n; i++)
#define Fox1(i,n) for (i=1; i<=n; i++)
#define FoxI(i,a,b) for (i=a; i<=b; i++)
#define FoxR(i,n) for (i=(n)-1; i>=0; i--)
#define FoxR1(i,n) for (i=n; i>0; i--)
#define FoxRI(i,a,b) for (i=b; i>=a; i--)
#define Foxen(i,s) for (i=s.begin(); i!=s.end(); i++)
#define Min(a,b) a=min(a,b)
#define Max(a,b) a=max(a,b)
#define Sz(s) int((s).size())
#define All(s) (s).begin(),(s).end()
#define Fill(s,v) memset(s,v,sizeof(s))
#define pb push_back
#define mp make_pair
#define x first
#define y second

template<typename T> T Abs(T x) { return(x<0 ? -x : x); }
template<typename T> T Sqr(T x) { return(x*x); }

const int INF = (int)1e9;
const LD EPS = 1e-12;
const LD PI = acos(-1.0);

bool Read(int &x)
{
	char c,r=0,n=0;
	x=0;
		for(;;)
		{
			c=getchar();
				if ((c<0) && (!r))
					return(0);
				if ((c=='-') && (!r))
					n=1;
				else
				if ((c>='0') && (c<='9'))
					x=x*10+c-'0',r=1;
				else
				if (r)
					break;
		}
		if (n)
			x=-x;
	return(1);
}

int main()
{
	int T,t;
	int N,R;
	int i,a,b,c,d,cur,ans;
	int X[50],Y[50];
	Read(T);
		Fox1(t,T)
		{
			Read(N),Read(R);
				Fox(i,N)
					Read(X[i]),Read(Y[i]);
			ans=0;
				Fox(a,N)
					Fox(b,N)
						Fox(c,N)
							Fox(d,N)
							{
								cur=0;
									Fox(i,N)
										cur+=(X[i]>=X[a] && X[i]<=X[a]+R && Y[i]>=Y[b] && Y[i]<=Y[b]+R) ||
										     (X[i]>=X[c] && X[i]<=X[c]+R && Y[i]>=Y[d] && Y[i]<=Y[d]+R);
								Max(ans,cur);
							}
			printf("Case #%d: %d\n",t,ans);
		}
	return(0);
}