• csu 1011 Counting Pixels


    没想象中的复杂;

    先将园分为四块以减少计算量(还可以再细分为八块,略显复杂);

    判断圆是如何穿过一个像素的:对于右上方的点,只有三种情况:从右边穿过,从右下角的顶点穿过,从下边穿过;

    先给出一个初始像素(被穿过),然后根据穿过的情况向下一个被穿过的像素扩展,并根据情况计数;

    像素的表示:右上方定点的坐标:

        Language: C
        Result: Accepted
        Time:236 ms
        Memory:740 kb
    最快的只有128ms,求指点。
     1 # include <stdio.h>
    2
    3 int x, y, r;
    4
    5 int state(int x, int y); // 1: right, 0: corner, -1: bottom
    6
    7 int main()
    8 {
    9 long long cnt;
    10
    11 freopen("in.txt", "r", stdin);
    12 freopen("out.txt", "w", stdout);
    13
    14 while (~scanf("%d%d%d", &x, &y, &r))
    15 {
    16 if (!(x || y || r)) break;
    17 cnt = 0;
    18 x = 1, y = r;
    19 while (x <= r && y >= 1)
    20 {
    21 if (state(x, y) == 1) ++cnt, --y;
    22 else if (state(x, y) == 0) cnt += y, ++x, --y;
    23 else if (state(x, y) == -1) cnt += y, ++x;
    24 else printf("wrong\n");
    25 }
    26 printf("%lld\n", cnt<<2);
    27 }
    28
    29 return 0;
    30 }
    31
    32 int state(int x, int y)
    33 {
    34 int t1, t2;
    35 --y;
    36 t2 = r*r;
    37 t1 = x*x + y*y;
    38 if (t1 > t2) return 1;
    39 if (t1 == t2) return 0;
    40 if (t1 < t2) return -1;
    41 }
    2012/3/13  00:10
    在上述代码的第19行的循环下,可以设置一个临时变量tmp, 保存state(x, y)的值,减少耗时(200ms)。
  • 相关阅读:
    Go语言基础之map
    Go语言基础之切片
    Go语言基础之数组
    Go语言fmt.Printf使用指南
    Go语言基础之流程控制
    Go语言基础之运算符
    Go语言基础之变量和常量
    Go语言环境搭建
    随笔
    使用SocketServer 创建TCP服务端
  • 原文地址:https://www.cnblogs.com/JMDWQ/p/2392684.html
Copyright © 2020-2023  润新知