• UVA10161 Ant on a Chessboard


    这道题找规律 ,如果暴力基本超时了 ,找到规律就好做了 我的方法是把表格看成一层一层的 倒着的L型是一层 然后把层中间的数计算出来 与用户输入的数作差 再判断下奇偶,分情况讨论 算法复杂度虽然说是 O(1)但是 代码感觉还是繁琐了 有空再想想更简单的解法。

    笔记:

    ceil是向上取整

    floor是向下取整

    题目及AC代码如下

     

     Problem A.Ant on a Chessboard 

    Background

      One day, an ant called Alice came to an M*M chessboard. She wanted to go around all the grids. So she began to walk along the chessboard according to this way: (you can assume that her speed is one grid per second)

      At the first second, Alice was standing at (1,1). Firstly she went up for a grid, then a grid to the right, a grid downward. After that, she went a grid to the right, then two grids upward, and then two grids to the left…in a word, the path was like a snake.

      For example, her first 25 seconds went like this:

      ( the numbers in the grids stands for the time when she went into the grids)

    25

    24

    23

    22

    21

    10

    11

    12

    13

    20

    9

    8

    7

    14

    19

    2

    3

    6

    15

    18

    1

    4

    5

    16

    17

    5

    4

    3

    2

    1

    1          2          3           4           5

    At the 8th second , she was at (2,3), and at 20th second, she was at (5,4).

    Your task is to decide where she was at a given time.

    (you can assume that M is large enough)

    Input

      Input file will contain several lines, and each line contains a number N(1<=N<=2*10^9), which stands for the time. The file will be ended with a line that contains a number 0.

    Output

      For each input situation you should print a line with two numbers (x, y), the column and the row number, there must be only a space between them.

    Sample Input

    8

    20

    25

    0

    Sample Output

    2 3

    5 4

    1 5

     1 #include<stdio.h>
     2 #include<math.h>
     3 
     4 int main(void)
     5 {
     6     int n;
     7     while (scanf("%d", &n) && n!=0)
     8     {
     9         int l = ceil((sqrt(1.0*n)));            //l指的是这个数所处的层数
    10         int lmid= l*l-(l-1);                            //lmax是这个层的中间那个数
    11         int dis = n - lmid;
    12         //分情况讨论
    13         if (l % 2==0 && dis >= 0) printf("%d %d", l, l - dis);
    14         else if (l % 2==0 && dis < 0) printf("%d %d", l + dis, l);
    15         else if (l % 2 && dis>=0) printf("%d %d", l - dis, l);
    16         else if (l % 2 && dis < 0) printf("%d %d", l, l + dis);
    17         printf("
    ");
    18     }
    19     return 0;
    20 }
  • 相关阅读:
    Excel透视表进阶之计算字段、计算项、切片器、页面布局
    Excel透视表进阶之排序、筛选、分组、总计与分类汇总
    Excel透视表基础之字段布局与重命名、更新、数字格式设置、空值与错误值、
    Excel透视表基础之数据源、创建、基本术语、基本操作
    NumPy基础
    Python读写Excel
    逻辑判断
    打印 PRINT
    面向对象
    循环控制
  • 原文地址:https://www.cnblogs.com/VOID-133/p/3574982.html
Copyright © 2020-2023  润新知