zoukankan      html  css  js  c++  java
  • 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;

    }

  • 相关阅读:
    Js--小笔记
    Android Gson解析
    java格式化数字、货币、金钱
    关于Edittext默认弹出软键盘为数字键
    生日星座自动匹配
    ANDROID STUDIO系列教程六--GRADLE多渠道打包
    框架,简化了代码的同时,也让我们慢慢变蠢
    Android开发实现高德地图定位
    onNewIntent调用时机
    EditText输入手机号自动带空格
  • 原文地址:https://www.cnblogs.com/Uiney117/p/14480003.html
Copyright © 2011-2022 走看看