zoukankan      html  css  js  c++  java
  • CSU1011: Counting Pixels

    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.

    counting_pixels_example

    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

    题意:给定圆心和半径,要你找这个圆覆盖了多少的矩形。由于圆是中心对称,所以考虑四分之一的圆。
    那么怎么想?考虑右上方的四分之圆,如果一个一个矩形被覆盖,那么这个矩形的左下角的点到圆心的距离一定小于半径,可以自己画下图理解,如果这个矩形在圆内,那么这个矩形以下的一列都会被圆覆盖,所以我们考虑离圆心最远
    的每个矩形,不断的向右向下走,直到它运动到圆心的水平线下。最后乘以4就是答案,不懂可以看代码和画图理解一下,应该不难。
    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <math.h>
    using namespace std;
    const int maxn=1005;
    typedef long long LL;
    int x,y,r;
    int main()
    {
        while(scanf("%d %d %d",&x,&y,&r)!=EOF)
        {
            if(x==0&&y==0&&r==0)
                return 0;
            else
            {
                LL ans=0;
                int i=r-1,j=0;
                LL temp=r*r;
                while(j<r)
                {
                    if(i*i+j*j<temp)
                        ans+=(i+1);
                    else
                    {
                        i--;
                        continue;
                    }
                    j++;
                }
                printf("%lld
    ",ans*4);
            }
        }
        return 0;
    }
    
    /**********************************************************************
    	Problem: 1011
    	User: therang
    	Language: C++
    	Result: AC
    	Time:28 ms
    	Memory:2024 kb
    **********************************************************************/
    

      

  • 相关阅读:
    acdream 1738 世风日下的哗啦啦族I 分块
    hihocoder #1179 : 永恒游戏 暴力
    hihocoder #1178 : 计数 暴力
    hihocoder #1177 : 顺子 模拟
    刷了500道水题是什么体验?
    scu 4436: Easy Math 水题
    JVM系列三:JVM参数设置、分析
    Eclipse插件Target Management (RSE)
    修改jsp文件tomcat发布失败(Could not delete May be locked by another process)
    oracle中修改表名
  • 原文地址:https://www.cnblogs.com/jkzr/p/9956712.html
Copyright © 2011-2022 走看看