SRM559 Div1 Easy(250) 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; }};