您的位置:首页 > 其它

UVa 10161 棋盘上的蚂蚁

2014-02-10 11:44 232 查看
/*

* 解题思路:

*  观察输入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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: