zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    C++之路进阶——codevs2439(降雨量)
    C++之路进阶——codevs2933(诗人小G)
    C++之路进阶——bzoj2879(美食节)
    C++之路进阶——bzoj1934(善意的投票)
    C++之路进阶——bzoj3876(支线剧情)
    C++之路进阶——codevs1281(Xn数列)
    八数码难题
    道路游戏
    细胞分裂
    最长链
  • 原文地址:https://www.cnblogs.com/gavanwanggw/p/7364489.html
Copyright © 2011-2022 走看看