Uva10161 Ant on a Chessboard

Uva10161 Ant on a Chessboard

10161 Ant on a Chessboard
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)
见下图
At the 8-th second , she was at (2,3), and at 20-th 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∗109), 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
这是原题截图
找出对角线的规律后,进行计算

/*
Author:ZCC;
Time:2015-6-4
Solve:对角线成差成等差数列。所以能够算出通项公式A_n=n*n-n+1
*/

#include<iostream>
#include<algorithm>
#include<map>
#include<cstdio>
#include<cstdlib>
#include<vector>
#include<cmath>
#include<cstring>
#include<string>
using namespace std;
const int maxn=44725;
typedef long long LL;

LL a[maxn];

int main(){
    //freopen("Text//in.txt","r",stdin);
    for(int i=0;i<maxn;i++){
        a[i]=(LL)i*i-i+1;
       // if(a[i]>2000000000){cout<<i<<endl;break;}
    }
    LL n;
    while(scanf("%lld",&n)&&n){
        int pos=lower_bound(a+1,a+maxn,n)-a;
       // cout<<"**"<<pos<<"**"<<endl;
        int x=pos,y=pos;
        if(pos&1){
            if(n>=a[pos]-pos+1){
                while(n<a[pos])n++,y--;
            }
            else {
                x--;
                y=pos-1;
                pos--;
                while(n>a[pos])n--,y--;
            }
        }
        else {
            if(n>=a[pos]-pos+1){
                while(n<a[pos])n++,x--;
            }
            else {
                y--;
                x=pos-1;
                pos--;
                while(n>a[pos])n--,x--;
            }
        }
        printf("%d %d
",x,y);
    }
    return 0;
}
原文地址:https://www.cnblogs.com/gavanwanggw/p/7364489.html