SRM559 Div1 Easy(250) HyperKnight

HyperKnight

ある場所からk回で移動できる場所の個数を聞かれているのだと勘違いして10分悩んだ(´Д`; ) k通りの移動ができる場所の個数を答えるのか。

盤面が以下のように25個の部分に分けられて、それぞれの移動可能数がセルの数字になる。幅は一番外側がa,bの短い方、その内側がa,bの長い方。

2 3 4 3 2
3 4 6 4 3
4 6 8 6 4
3 4 6 4 3
2 3 4 3 2
#include <iostream>
using namespace std;

class HyperKnight{public:
long long countCells( int a, int b, int numRows, int numColumns, int k )
{
    if ( a>b )
        swap(a,b);

    switch ( k )
    {
    case 2:
        return 4LL*a*a;
    case 3:
        return 8LL*a*(b-a);
    case 4:
        return 2LL*(numRows-2*b)*a +
               2LL*(numColumns-2*b)*a +
               4LL*(b-a)*(b-a);
    case 6:
        return 2LL*(numRows-2*b)*(b-a)+
               2LL*(numColumns-2*b)*(b-a);
    case 8:
        return 1LL*(numRows-2*b)*(numColumns-2*b);
    }
    return 0LL;
}};