// C++ implementation of the approach
#include <bits/stdc++.h>
using namespace std;
#define R 4
#define C 4
// Function to return the count of possible paths
// in a maze[R][C] from (0, 0) to (R-1, C-1) that
// do not pass through any of the marked cells
int countPaths(int maze[][C])
{
// If the initial cell is blocked, there is no
// way of moving anywhere
if (maze[0][0] == -1)
return 0;
// Initializing the leftmost column
for (int i = 0; i < R; i++) {
if (maze[i][0] == 0)
maze[i][0] = 1;
// If we encounter a blocked cell in leftmost
// row, there is no way of visiting any cell
// directly below it.
else
break;
}
// Similarly initialize the topmost row
for (int i = 1; i < C; i++) {
if (maze[0][i] == 0)
maze[0][i] = 1;
// If we encounter a blocked cell in bottommost
// row, there is no way of visiting any cell
// directly below it.
else
break;
}
// The only difference is that if a cell is -1,
// simply ignore it else recursively compute
// count value maze[i][j]
for (int i = 1; i < R; i++) {
for (int j = 1; j < C; j++) {
// If blockage is found, ignore this cell
if (maze[i][j] == -1)
continue;
// If we can reach maze[i][j] from maze[i-1][j]
// then increment count.
if (maze[i - 1][j] > 0)
maze[i][j] = (maze[i][j] + maze[i - 1][j]);
// If we can reach maze[i][j] from maze[i][j-1]
// then increment count.
if (maze[i][j - 1] > 0)
maze[i][j] = (maze[i][j] + maze[i][j - 1]);
}
}
// If the final cell is blocked, output 0, otherwise
// the answer
return (maze[R - 1][C - 1] > 0) ? maze[R - 1][C - 1] : 0;
}
// Function to return the count of all possible
// paths from (0, 0) to (n - 1, m - 1)
int numberOfPaths(int m, int n)
{
// We have to calculate m+n-2 C n-1 here
// which will be (m+n-2)! / (n-1)! (m-1)!
int path = 1;
for (int i = n; i < (m + n - 1); i++) {
path *= i;
path /= (i - n + 1);
}
return path;
}
// Function to return the total count of paths
// from (0, 0) to (n - 1, m - 1) that pass
// through at least one of the marked cells
int solve(int maze[][C])
{
// Total count of paths - Total paths that do not
// pass through any of the marked cell
int ans = numberOfPaths(R, C) - countPaths(maze);
// return answer
return ans;
}
// Driver code
int main()
{
int maze[R][C] = { { 0, 0, 0, 0 },
{ 0, -1, 0, 0 },
{ -1, 0, 0, 0 },
{ 0, 0, 0, 0 } };
cout << solve(maze);
return 0;
}
Ly8gQysrIGltcGxlbWVudGF0aW9uIG9mIHRoZSBhcHByb2FjaCAKI2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+IAp1c2luZyBuYW1lc3BhY2Ugc3RkOyAKI2RlZmluZSBSIDQgCiNkZWZpbmUgQyA0IAoKLy8gRnVuY3Rpb24gdG8gcmV0dXJuIHRoZSBjb3VudCBvZiBwb3NzaWJsZSBwYXRocyAKLy8gaW4gYSBtYXplW1JdW0NdIGZyb20gKDAsIDApIHRvIChSLTEsIEMtMSkgdGhhdCAKLy8gZG8gbm90IHBhc3MgdGhyb3VnaCBhbnkgb2YgdGhlIG1hcmtlZCBjZWxscyAKaW50IGNvdW50UGF0aHMoaW50IG1hemVbXVtDXSkgCnsgCgkvLyBJZiB0aGUgaW5pdGlhbCBjZWxsIGlzIGJsb2NrZWQsIHRoZXJlIGlzIG5vIAoJLy8gd2F5IG9mIG1vdmluZyBhbnl3aGVyZSAKCWlmIChtYXplWzBdWzBdID09IC0xKSAKCQlyZXR1cm4gMDsgCgoJLy8gSW5pdGlhbGl6aW5nIHRoZSBsZWZ0bW9zdCBjb2x1bW4gCglmb3IgKGludCBpID0gMDsgaSA8IFI7IGkrKykgeyAKCQlpZiAobWF6ZVtpXVswXSA9PSAwKSAKCQkJbWF6ZVtpXVswXSA9IDE7IAoKCQkvLyBJZiB3ZSBlbmNvdW50ZXIgYSBibG9ja2VkIGNlbGwgaW4gbGVmdG1vc3QgCgkJLy8gcm93LCB0aGVyZSBpcyBubyB3YXkgb2YgdmlzaXRpbmcgYW55IGNlbGwgCgkJLy8gZGlyZWN0bHkgYmVsb3cgaXQuIAoJCWVsc2UKCQkJYnJlYWs7IAoJfSAKCgkvLyBTaW1pbGFybHkgaW5pdGlhbGl6ZSB0aGUgdG9wbW9zdCByb3cgCglmb3IgKGludCBpID0gMTsgaSA8IEM7IGkrKykgeyAKCQlpZiAobWF6ZVswXVtpXSA9PSAwKSAKCQkJbWF6ZVswXVtpXSA9IDE7IAoKCQkvLyBJZiB3ZSBlbmNvdW50ZXIgYSBibG9ja2VkIGNlbGwgaW4gYm90dG9tbW9zdCAKCQkvLyByb3csIHRoZXJlIGlzIG5vIHdheSBvZiB2aXNpdGluZyBhbnkgY2VsbCAKCQkvLyBkaXJlY3RseSBiZWxvdyBpdC4gCgkJZWxzZQoJCQlicmVhazsgCgl9IAoKCS8vIFRoZSBvbmx5IGRpZmZlcmVuY2UgaXMgdGhhdCBpZiBhIGNlbGwgaXMgLTEsIAoJLy8gc2ltcGx5IGlnbm9yZSBpdCBlbHNlIHJlY3Vyc2l2ZWx5IGNvbXB1dGUgCgkvLyBjb3VudCB2YWx1ZSBtYXplW2ldW2pdIAoJZm9yIChpbnQgaSA9IDE7IGkgPCBSOyBpKyspIHsgCgkJZm9yIChpbnQgaiA9IDE7IGogPCBDOyBqKyspIHsgCgkJCS8vIElmIGJsb2NrYWdlIGlzIGZvdW5kLCBpZ25vcmUgdGhpcyBjZWxsIAoJCQlpZiAobWF6ZVtpXVtqXSA9PSAtMSkgCgkJCQljb250aW51ZTsgCgoJCQkvLyBJZiB3ZSBjYW4gcmVhY2ggbWF6ZVtpXVtqXSBmcm9tIG1hemVbaS0xXVtqXSAKCQkJLy8gdGhlbiBpbmNyZW1lbnQgY291bnQuIAoJCQlpZiAobWF6ZVtpIC0gMV1bal0gPiAwKSAKCQkJCW1hemVbaV1bal0gPSAobWF6ZVtpXVtqXSArIG1hemVbaSAtIDFdW2pdKTsgCgoJCQkvLyBJZiB3ZSBjYW4gcmVhY2ggbWF6ZVtpXVtqXSBmcm9tIG1hemVbaV1bai0xXSAKCQkJLy8gdGhlbiBpbmNyZW1lbnQgY291bnQuIAoJCQlpZiAobWF6ZVtpXVtqIC0gMV0gPiAwKSAKCQkJCW1hemVbaV1bal0gPSAobWF6ZVtpXVtqXSArIG1hemVbaV1baiAtIDFdKTsgCgkJfSAKCX0gCgoJLy8gSWYgdGhlIGZpbmFsIGNlbGwgaXMgYmxvY2tlZCwgb3V0cHV0IDAsIG90aGVyd2lzZSAKCS8vIHRoZSBhbnN3ZXIgCglyZXR1cm4gKG1hemVbUiAtIDFdW0MgLSAxXSA+IDApID8gbWF6ZVtSIC0gMV1bQyAtIDFdIDogMDsgCn0gCi8vIEZ1bmN0aW9uIHRvIHJldHVybiB0aGUgY291bnQgb2YgYWxsIHBvc3NpYmxlIAovLyBwYXRocyBmcm9tICgwLCAwKSB0byAobiAtIDEsIG0gLSAxKSAKaW50IG51bWJlck9mUGF0aHMoaW50IG0sIGludCBuKSAKeyAKCS8vIFdlIGhhdmUgdG8gY2FsY3VsYXRlIG0rbi0yIEMgbi0xIGhlcmUgCgkvLyB3aGljaCB3aWxsIGJlIChtK24tMikhIC8gKG4tMSkhIChtLTEpISAKCWludCBwYXRoID0gMTsgCglmb3IgKGludCBpID0gbjsgaSA8IChtICsgbiAtIDEpOyBpKyspIHsgCgkJcGF0aCAqPSBpOyAKCQlwYXRoIC89IChpIC0gbiArIDEpOyAKCX0gCglyZXR1cm4gcGF0aDsgCn0gCgovLyBGdW5jdGlvbiB0byByZXR1cm4gdGhlIHRvdGFsIGNvdW50IG9mIHBhdGhzIAovLyBmcm9tICgwLCAwKSB0byAobiAtIDEsIG0gLSAxKSB0aGF0IHBhc3MgCi8vIHRocm91Z2ggYXQgbGVhc3Qgb25lIG9mIHRoZSBtYXJrZWQgY2VsbHMgCmludCBzb2x2ZShpbnQgbWF6ZVtdW0NdKSAKeyAKCgkvLyBUb3RhbCBjb3VudCBvZiBwYXRocyAtIFRvdGFsIHBhdGhzIHRoYXQgZG8gbm90IAoJLy8gcGFzcyB0aHJvdWdoIGFueSBvZiB0aGUgbWFya2VkIGNlbGwgCglpbnQgYW5zID0gbnVtYmVyT2ZQYXRocyhSLCBDKSAtIGNvdW50UGF0aHMobWF6ZSk7IAoKCS8vIHJldHVybiBhbnN3ZXIgCglyZXR1cm4gYW5zOyAKfSAKCi8vIERyaXZlciBjb2RlIAppbnQgbWFpbigpIAp7IAoJaW50IG1hemVbUl1bQ10gPSB7IHsgMCwgMCwgMCwgMCB9LCAKCQkJCQl7IDAsIC0xLCAwLCAwIH0sIAoJCQkJCXsgLTEsIDAsIDAsIDAgfSwgCgkJCQkJeyAwLCAwLCAwLCAwIH0gfTsgCgoJY291dCA8PCBzb2x2ZShtYXplKTsgCgoJcmV0dXJuIDA7IAp9IAo=