题目链接:http://acm.ayit.edu.cn/problem/51
分析:
在(1,1)点走k步,相当于在(0,0)点走k+1步。
此题的关键是横竖交叉点的位置。
横走了交叉点,竖就不能走。
竖走了交叉点,横就不能走。
记录横竖走的次数,根据对应关系,算出最终坐标。
代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long LL;
int main()
{
LL n,m;
scanf("%lld%lld",&n,&m);/*n*n的网格,走m步*/
LL heng=n,shu=n,h=0,s=0,flag;
m=m+1;/*退到(1,1)外边走,等于多走一步*/
while(1)
{
/*一圈有2横2竖,看在哪一个位置停止*/
if(m>heng)
{
m-=heng;/*角落被横竖都占了,横走了,竖的就不走了*/
h+=1;/*横着的走几次*/
shu-=1;
}
else
{
flag=1;
break;
}
if(m>shu)
{
m-=shu;
heng-=1;
s+=1;/*竖着的走几次*/
}
else
{
flag=2;
break;
}
if(m>heng)
{
m-=heng;
h+=1;
shu-=1;
}
else
{
flag=3;
break;
}
if(m>shu)
{
m-=shu;
heng-=1;
s+=1;
}
else
{
flag=4;
break;
}
}
LL x,y;
if(flag==1)
{
x=h/2+1;
y=s/2+m;
}
if(flag==2)
{
x=h/2+1+m;
y=n-s/2;
}
if(flag==3)
{
x=n-h/2;
y=n-(s/2+m);
}
if(flag==4)
{
x=n-(h/2+m)+1;
y=s/2+1;
}
printf("%lld %lld\n",x,y);
return 0;
}
构造心灵生态