滑雪(思维)

题目链接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)
    {
        /*一圈有22竖,看在哪一个位置停止*/
        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;
}

构造心灵生态

发布了165 篇原创文章 · 获赞 6 · 访问量 5070

猜你喜欢

转载自blog.csdn.net/lylzsx20172018/article/details/103304186
今日推荐