/*
* 解题思路:
* 观察输入N可知,输入N最大为2*10^9,若模拟其行走过程则超时( 也不要考虑用数组存,开不了2*10^9这么大的数组 )
* 此题技巧是采用数学推导规律的方法进行解题!
*/
分奇偶讨论版本:
#include <math.h> #include <stdio.h> int main( ) { int n; int x; while( scanf("%d",&n) && n ) { x = (int)sqrt( n ); if( (x*x) & 1 ) if( x*x == n ) printf("%d %d\n",1 , x ); else if( n-x*x > x+1 ) printf("%d %d\n",x+1,x-(n-x*x)); else printf("%d %d\n",n-x*x,x+1); else if( x*x == n ) printf("%d %d\n",x,1); else if( n-x*x > x+1 ) printf("%d %d\n",x+1-(n-x*x-x-1),x+1); else printf("%d %d\n",x+1,n-x*x); } return 0; }
模拟其过程版本(TimeLimit ):
#include <stdio.h> int dir[ 10 ] = {0,1,2,3,2,1,4}; int q; int main( ) { int n; int xx , yy; int i; int sum,total,vis; while( scanf("%d",&n) && n ) { xx = yy = 0; q = sum = 1; n--; total = 0; vis = 3; while( n-- ) { if( total < vis ) total++; else if( total == vis ) { total = 0; sum++; vis += 2; } if( dir[ q ] == 1 ) { if( yy < sum ) yy++; else { q++; if( dir[ q ] == 2 ) xx++; else if( dir[ q ] == 4 ) xx--; } } else if( dir[ q ] == 2 ) { if( xx < sum ) xx++; else { q++; if( dir[ q ] == 3 ) yy--; else if( dir[ q ] == 1 ) yy++; } } else if( dir[ q ] == 3 ) { if( yy > 0 ) yy--; else { q++; xx++; } } else if( dir[ q ] == 4 ) { if( xx > 0 ) xx--; else { q = 1; yy++;; } } } printf("%d %d\n",++xx,++yy); } return 0; }
原文:http://blog.csdn.net/u011886588/article/details/19032583