zoukankan      html  css  js  c++  java
  • csuoj-1011-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
    分析:
    1,根据对称性,只求左上角区域即可;
    2,从1到r-1,求出对应直角三角形的高,如果刚好为整数,就加上h,否则加上h + 1,最后再加上r,再乘以4。
    代码:
    #include<iostream>
    #include<cmath>
    using namespace std;
    int main(){
        cin.sync_with_stdio(false);
        long long x,y,r;
        while(cin >> x >> y >> r){
            if(x == 0 && y == 0 && r == 0)
                break;
            else{
                long long ans = r;
                for(long long i = 1;i <= r - 1;i++){
                    long long h = (long long)sqrt((long double)r * r - i * i);
                    if(h * h + i * i == r * r) ans += h;
                    else ans += h + 1;
                }
                cout << 4 * ans << endl;
            }
        }
        return 0;
    }
     
  • 相关阅读:
    学指令 emacs篇
    c 排序 总结
    C# WinForm源码下载
    PetShop下载
    Visual Studio常用技巧
    人事信息管理系统(PMS)
    css实现细表格原理
    GridView导出Excel/Word
    dotnet程序员装机必备工具
    容器练习一
  • 原文地址:https://www.cnblogs.com/tracy520/p/6691479.html
Copyright © 2011-2022 走看看