【NEEPU OJ】1004--Double Eleven

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_34072526/article/details/86681658

描述

Today is The Double Eleven.However,I want to pursue my happiness.I do not wanna be a Damn Single!

One day, a girl called W(Well…she is my fiancee…)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, W 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)

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

Your task is to help me to calculate where she was at a given time (you can assume that M is large enough).

输入

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’.

输出

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.

输入样例 1

8
20
25
0

输出样例 1

2 3
5 4
1 5

来源

own


思路

我们可以将图改成这样

1 2 3 4 5
1 1 4 5 16 17
2 2 3 6 15 18
3 9 8 7 14 19
4 10 11 12 13 20
5 25 24 23 22 21

观察对角线

3 - 1 = 2    7 - 3 = 4    13 - 7 = 6

我们可以看到对角线上的差值是等差数列,其公差为2
(Sn为对角线上第n个数的值减去第n-1个数的值)

因此    Sn-1 = 2(n-1) = An - An-1
所以    An = n2 - n + 1(对角线上第n个数的值)

用这个值去求上边和左边的数就会很简单了
只需判断n的奇偶来执行x与y的加减即可。


代码

#include <cstdio>
#include <cmath>
using namespace std;

void moni(int n){ //  An = mid = n * n - n + 1; An - A(n-1) = 2 * (n-1)
    int i, x, y, t, mid;
    mid = sqrt(n);
    if(mid * mid != n) mid++; //  计算值在第几个对角线
    x = y = mid * mid - mid + 1; //  得到该值所处的对角线的值
    if(x == n) printf("%d %d\n", mid, mid);
    t = mid;
    for(i = 1; i < t; i++){
        if(t % 2 == 0){
            x--;
            y++;
        }
        else{
            x++;
            y--;
        }
        mid--;
        if(x == n) printf("%d %d\n", mid, t);
        else if(y == n) printf("%d %d\n", t, mid);
    }
}

int main(){
    int n;
    while(~scanf("%d", &n)){
        if(n == 0) return 0;
        else moni(n);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_34072526/article/details/86681658
今日推荐