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
    **********************************************************************/
    

      

  • 相关阅读:
    Docker部署LAMP搭建wordpress博客系统
    Docker教程---基本操作
    华为VS网络虚拟化技术
    云数据中心基础设施层概述
    EVE-NG模拟器关联SecureCRT、Wireshark软件
    Centos7.4安装openstack(queens)cinder卷类型和云主机安全
    围观大神的文件读取操作
    浅谈python垃圾回收机制
    Python网络爬虫开发实战使用XPath,xpath的多种用法
    快来学习怎么可视化监控你的Python爬虫
  • 原文地址:https://www.cnblogs.com/jkzr/p/9956712.html
Copyright © 2011-2022 走看看