1. 程式人生 > >Uva10161 Ant on a Chessboard

Uva10161 Ant on a Chessboard

function pen spl like auth add several script was

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\n",x,y); } return 0; }

Uva10161 Ant on a Chessboard