• C. Board Moves(递推)


    题意:有一个n*n的方格图,每个格子可以向周围8个方向移动,一次只能移动一步,最后要让所有的格子都移动到中间格子,问要多少步才能实现目标。

    题解:

    自己画的图:

             

    当n=1时,只有中间一个小格,所以不需要移动,答案为0。

    当n=3时,就要让橙色那一圈方格都移到中间,八个方格移动的步数就是8。

    当n=5时,蓝色那圈每个格子需要两步,一共是16个格子,再加上橙色那圈,就是16x2+8,一共40步。

    意思弄懂之后,就是解题,阿巴!

    首先,某个方格在第n圈,它移动到中心就需要(n-1)步,

    其次,第二圈是(2-1)*8格,第三圈是(3-1)*8,所以第n圈,就是(n-1)*8格;

    设圈数为i,i=1时,step[1]=0;当i=2时,step[2]=(2-1)*8*(2-1)+step[1];当i=3时,step[3]=(3-1)*8*(3-1);也就是,每一圈对应的格数乘以每一格需要移动的次数,就是当前那一圈的步数,我们用递归把他加起来,存在数组里。

    圈数和题中的n不相符合,但是,圈数=(n+1)/2,就可以处理数据了。

    ACcode:

    ll a[500100];

    void calcu(ll n){

    a[1] = 0;

    for(ll i=2;i<n;i++)

    a[i] = a[i- 1] + 8 * (i- 1) * (i - 1);

    }

    int main(){

    calcu(500010);

    int t;

    cin >> t;

    while (t--){

    ll n;

    cin >> n;

    cout << a[(n + 1) / 2] << endl;//这里是把n转化成圈数,方便计算。

    }

    return 0;

    }

  • 相关阅读:
    ElasticSearch调优问题
    Ceph源码解析:概念
    Ceph神坑系列
    Mac下VirtualBox共享文件夹设置
    API教程
    设计师最常用网站汇总
    从码农到大神,有多少经验值得借鉴?
    登录注册 页面
    NET面试题 (四)
    Sqlserver面试题
  • 原文地址:https://www.cnblogs.com/Uiney117/p/14480003.html
Copyright © 2020-2023  润新知