Description
Did you know that if you draw a circle that fills the screen on your 1080p high definition display, almost a million pixels are lit? That's a lot of pixels! But do you know exactly how many pixels are lit? Let's find out!
Assume that our display is set on a Cartesian grid where every pixel is a perfect unit square. For example, one pixel occupies the area of a square with corners (0,0) and (1,1). A circle can be drawn by specifying its center in grid coordinates and its radius. On our display, a pixel is lit if any part of it is covered by the circle being drawn; pixels whose edge or corner are just touched by the circle, however, are not lit.
Your job is to compute the exact number of pixels that are lit when a circle with a given position and radius is drawn.
Input
The input consists of several test cases, each on a separate line. Each test case consists of three integers, x,y, and r(1≤x,y,r≤1,000,000), specifying respectively the center (x,y) and radius of the circle drawn. Input is followed by a single line with x = y = r = 0, which should not be processed.
Output
For each test case, output on a single line the number of pixels that are lit when the specified circle is drawn. Assume that the entire circle will fit within the area of the display.
Sample Input
1 1 1 5 2 5 0 0 0
Sample Output
4 88
代码:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while(scanner.hasNext()){
long a = scanner.nextLong(), b = scanner.nextLong(), r = scanner.nextLong();
if(a == 0 && b == 0 && r == 0){ break; }
long s = r*r*4;
int cnt = 0;
long[] op = new long[(int)r];
long temp = 0;
for(long y = r - 1; y >= 0; y--){
for(long x = temp; x <= r;){
if(x * x + y * y < r * r){
x++;
}else{
op[cnt] = x;
cnt++;
temp = x;
break;
}
}
}
long result= 0;
for(int i = 0; i < r; i++){
result += op[i];
}
System.out.println(4*result);
}
}
}