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 ≤ 2109), 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-4Solve:对角线成差成等差数列,所以可以算出通项公式A_n=nusing 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

相关文章:

你感兴趣的文章:

标签云: