/*
QUESTION 8: Knight Rider Paths to Corners
Problem Statement:
You are given integer N.
The board size is 2N x 2N.
A rider starts at the top-left cell.
In one move, the rider moves like a chess knight.
You are also given K.
Count the number of distinct paths that reach any corner of the board using at most K moves.
Hard Constraints:
1 <= N <= 10
1 <= K <= 10
Example:
N = 3
K = 2
Expected Output:
1
Explanation:
The starting cell is already a corner, so the 0-move path is counted.
No other corner is reached within 2 moves in this example.
Brute Force:
Recursively try all knight moves up to K moves.
Count paths that end at a corner.
Time Complexity:
O(8^K)
Optimized Approach:
Use DP by number of moves.
dp[x][y] =
number of ways to stand at cell (x, y) after current moves.
For every step, move from each cell to all valid knight positions.
Whenever a corner is reached, add those paths to the answer.
Time Complexity:
O(K * N^2)
Space Complexity:
O(N^2)
*/
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
long long countPaths(int N, int K) {
int L = 2 * N;
vector<pair<int, int>> moves = {
{2, 1}, {2, -1}, {-2, 1}, {-2, -1},
{1, 2}, {1, -2}, {-1, 2}, {-1, -2}
};
vector<vector<long long>> dp(L, vector<long long>(L, 0));
dp[0][0] = 1;
long long ans = 1;
auto isTargetCorner = [&](int x, int y) {
if (x == 0 && y == 0) return false;
return (x == 0 && y == L - 1) ||
(x == L - 1 && y == 0) ||
(x == L - 1 && y == L - 1);
};
for (int step = 1; step <= K; step++) {
vector<vector<long long>> next(L, vector<long long>(L, 0));
for (int x = 0; x < L; x++) {
for (int y = 0; y < L; y++) {
if (dp[x][y] == 0) continue;
for (auto [dx, dy] : moves) {
int nx = x + dx;
int ny = y + dy;
if (nx >= 0 && nx < L && ny >= 0 && ny < L) {
next[nx][ny] += dp[x][y];
}
}
}
}
for (int x = 0; x < L; x++) {
for (int y = 0; y < L; y++) {
if (isTargetCorner(x, y)) {
ans += next[x][y];
}
}
}
dp = next;
}
return ans;
}
};
int main() {
Solution sol;
int N = 3;
int K = 2;
cout << sol.countPaths(N, K) << endl;
return 0;
}
LyoKUVVFU1RJT04gODogS25pZ2h0IFJpZGVyIFBhdGhzIHRvIENvcm5lcnMKClByb2JsZW0gU3RhdGVtZW50OgpZb3UgYXJlIGdpdmVuIGludGVnZXIgTi4KVGhlIGJvYXJkIHNpemUgaXMgMk4geCAyTi4KCkEgcmlkZXIgc3RhcnRzIGF0IHRoZSB0b3AtbGVmdCBjZWxsLgoKSW4gb25lIG1vdmUsIHRoZSByaWRlciBtb3ZlcyBsaWtlIGEgY2hlc3Mga25pZ2h0LgoKWW91IGFyZSBhbHNvIGdpdmVuIEsuCkNvdW50IHRoZSBudW1iZXIgb2YgZGlzdGluY3QgcGF0aHMgdGhhdCByZWFjaCBhbnkgY29ybmVyIG9mIHRoZSBib2FyZCB1c2luZyBhdCBtb3N0IEsgbW92ZXMuCgpIYXJkIENvbnN0cmFpbnRzOgoxIDw9IE4gPD0gMTAKMSA8PSBLIDw9IDEwCgpFeGFtcGxlOgpOID0gMwpLID0gMgoKRXhwZWN0ZWQgT3V0cHV0OgoxCgpFeHBsYW5hdGlvbjoKVGhlIHN0YXJ0aW5nIGNlbGwgaXMgYWxyZWFkeSBhIGNvcm5lciwgc28gdGhlIDAtbW92ZSBwYXRoIGlzIGNvdW50ZWQuCk5vIG90aGVyIGNvcm5lciBpcyByZWFjaGVkIHdpdGhpbiAyIG1vdmVzIGluIHRoaXMgZXhhbXBsZS4KCkJydXRlIEZvcmNlOgpSZWN1cnNpdmVseSB0cnkgYWxsIGtuaWdodCBtb3ZlcyB1cCB0byBLIG1vdmVzLgpDb3VudCBwYXRocyB0aGF0IGVuZCBhdCBhIGNvcm5lci4KClRpbWUgQ29tcGxleGl0eToKTyg4XkspCgpPcHRpbWl6ZWQgQXBwcm9hY2g6ClVzZSBEUCBieSBudW1iZXIgb2YgbW92ZXMuCgpkcFt4XVt5XSA9Cm51bWJlciBvZiB3YXlzIHRvIHN0YW5kIGF0IGNlbGwgKHgsIHkpIGFmdGVyIGN1cnJlbnQgbW92ZXMuCgpGb3IgZXZlcnkgc3RlcCwgbW92ZSBmcm9tIGVhY2ggY2VsbCB0byBhbGwgdmFsaWQga25pZ2h0IHBvc2l0aW9ucy4KV2hlbmV2ZXIgYSBjb3JuZXIgaXMgcmVhY2hlZCwgYWRkIHRob3NlIHBhdGhzIHRvIHRoZSBhbnN3ZXIuCgpUaW1lIENvbXBsZXhpdHk6Ck8oSyAqIE5eMikKClNwYWNlIENvbXBsZXhpdHk6Ck8oTl4yKQoqLwoKI2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgpjbGFzcyBTb2x1dGlvbiB7CnB1YmxpYzoKICAgIGxvbmcgbG9uZyBjb3VudFBhdGhzKGludCBOLCBpbnQgSykgewogICAgICAgIGludCBMID0gMiAqIE47CgogICAgICAgIHZlY3RvcjxwYWlyPGludCwgaW50Pj4gbW92ZXMgPSB7CiAgICAgICAgICAgIHsyLCAxfSwgezIsIC0xfSwgey0yLCAxfSwgey0yLCAtMX0sCiAgICAgICAgICAgIHsxLCAyfSwgezEsIC0yfSwgey0xLCAyfSwgey0xLCAtMn0KICAgICAgICB9OwoKICAgICAgICB2ZWN0b3I8dmVjdG9yPGxvbmcgbG9uZz4+IGRwKEwsIHZlY3Rvcjxsb25nIGxvbmc+KEwsIDApKTsKICAgICAgICBkcFswXVswXSA9IDE7CgogICAgICAgIGxvbmcgbG9uZyBhbnMgPSAxOwoKICAgICAgICBhdXRvIGlzVGFyZ2V0Q29ybmVyID0gWyZdKGludCB4LCBpbnQgeSkgewogICAgICAgICAgICBpZiAoeCA9PSAwICYmIHkgPT0gMCkgcmV0dXJuIGZhbHNlOwoKICAgICAgICAgICAgcmV0dXJuICh4ID09IDAgJiYgeSA9PSBMIC0gMSkgfHwKICAgICAgICAgICAgICAgICAgICh4ID09IEwgLSAxICYmIHkgPT0gMCkgfHwKICAgICAgICAgICAgICAgICAgICh4ID09IEwgLSAxICYmIHkgPT0gTCAtIDEpOwogICAgICAgIH07CgogICAgICAgIGZvciAoaW50IHN0ZXAgPSAxOyBzdGVwIDw9IEs7IHN0ZXArKykgewogICAgICAgICAgICB2ZWN0b3I8dmVjdG9yPGxvbmcgbG9uZz4+IG5leHQoTCwgdmVjdG9yPGxvbmcgbG9uZz4oTCwgMCkpOwoKICAgICAgICAgICAgZm9yIChpbnQgeCA9IDA7IHggPCBMOyB4KyspIHsKICAgICAgICAgICAgICAgIGZvciAoaW50IHkgPSAwOyB5IDwgTDsgeSsrKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGRwW3hdW3ldID09IDApIGNvbnRpbnVlOwoKICAgICAgICAgICAgICAgICAgICBmb3IgKGF1dG8gW2R4LCBkeV0gOiBtb3ZlcykgewogICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnggPSB4ICsgZHg7CiAgICAgICAgICAgICAgICAgICAgICAgIGludCBueSA9IHkgKyBkeTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChueCA+PSAwICYmIG54IDwgTCAmJiBueSA+PSAwICYmIG55IDwgTCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dFtueF1bbnldICs9IGRwW3hdW3ldOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBmb3IgKGludCB4ID0gMDsgeCA8IEw7IHgrKykgewogICAgICAgICAgICAgICAgZm9yIChpbnQgeSA9IDA7IHkgPCBMOyB5KyspIHsKICAgICAgICAgICAgICAgICAgICBpZiAoaXNUYXJnZXRDb3JuZXIoeCwgeSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgYW5zICs9IG5leHRbeF1beV07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBkcCA9IG5leHQ7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gYW5zOwogICAgfQp9OwoKaW50IG1haW4oKSB7CiAgICBTb2x1dGlvbiBzb2w7CgogICAgaW50IE4gPSAzOwogICAgaW50IEsgPSAyOwoKICAgIGNvdXQgPDwgc29sLmNvdW50UGF0aHMoTiwgSykgPDwgZW5kbDsKCiAgICByZXR1cm4gMDsKfQ==