SP5609 KMOVES - Knight Moves题解

传送门 点我

推销 点我

题意

很明白了吧。
就是注意一点,骑士的走路方式是和马一样的。
你就可以理解为是国际象棋中的那个马。没错就是这样。

思路

这么好的题为啥没人写捏?
首先,我们先画一张棋盘,模拟一下前几次的情况。

其中红色是初始位置,紫色是第一次的扩张变化,黄色是第二次的,绿色是第三次的,蓝色是第四次的,深橙色是第五次的,淡澄色是第六次的。 (当然,是可以跳来跳去的,所以结论应该是当前棋盘上所有有颜色的黑块)

设当前是 n 次,那么我们会找到这么几个规律: 

  1. 当 n 为奇数时,结果定为 0
  2. 当 n 为 0 时,结果为 1
  3. 当 n 为 2 时,结果为 33
  4. 当 n 为其他偶数时,结果为 ((2n+2n+1) \times (2n)+(2n+1 ) - (n/2) \times (n/2) \times 4) 

接下来我会为大家解释为什么会有第四种的那个式子。
我们假设当前的棋盘为上图,以最大的为例,会发现它是一个八边形。
我们考虑把这个八边形的左下、右下、左上、右上四个角补全,通过周期就可以简单地求出当前补全后的图形中有多少个黑块了。
然后考虑多余的四个角,不难发现,四个角上,每个角的黑块个数就是1+2+3+...+n-1,转换得(n/2)^2,也就是一共有 4(n/2)^2 个黑块被多算了。

Code

#include<bits/stdc++.h>
using namespace std;
int t,n;
int main(){
    scanf("%d",&t);
    while(t--){
        scanf("%d",&n);
        if(n&1){
            printf("0\n");
            continue;
        }
        if(n==0){
            printf("1\n");
            continue;
        }
        if(n==2){
            printf("33\n");
            continue;
        }
        printf("%lld\n",1ll*(1ll*(n*2+n*2+1)*(n*2)+1ll*(n*2+1)-1ll*(n/2)*(n/2)*4));
    }
    return 0;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值