给定迷宫表示为行X col矩阵,其中障碍物表示为-1,并且透明单元格的值不同于-1。目标是从第一个单元格arr [0] [0]开始并到达最后一个单元格arr [row] [col],以便仅允许两个移动:
向右移arr [i] [j]到arr [i] [j + 1]和
向下移动arr [i] [j]到arr [i + 1] [j]。
输入 -arr [row] [col] = {{0,0,0},{-1,-1,0},{0,0,0}}
输出-在迷宫中到达目的地的方式数量计数:1
解释
0 1 2
0 0 0 0
1 -1 -1 0
2 0 0 0
方式将是:
像元(0,0)→像元(0,1)→像元(0,2)→像元(1,2)→像元(2,0)
输入 -arr [row] [col] = {{0,0,0,0},{-1,0,-1,0},{-1,0,-1,0},{0,0, 0,0}}
输出-在迷宫中到达目的地的方式数量计数:2
解释
0 1 2 3
0 0 0 0 0
1 -1 0 -1 0
2 -1 0 -1 0
3 0 0 0 0
方式将是:
像元(0,0)→像元(0,1)→像元(1,1)→像元(2,1)→像元(3,1)→像元(3,2)→像元(3,3)
像元(0,0)→像元(0,1)→像元(0,2)→像元(0,3)→像元(1,3)→像元(2,3)→像元(3,3)
在这种方法中,我们首先将所有零设置为1。再次遍历迷宫矩阵,现在遍历每个单元格(如果是阻塞(-1),则忽略它)。如果不是,则检查上部单元格(i-1,j)和左侧单元格(i,j-1)。如果大于零,则将其值添加到当前单元格(i,j)。这样,我们将在单元格(row-1,col-1)上获得总和,作为达到该总和的方法。
以输入数组arr [row] [col]作为迷宫。
函数destination_maze(int arr [row] [col])接受arr并返回迷宫中到达目的地的方式数。
如果第一个单元格被阻塞,则返回0作为到达终点的方式。
现在遍历最左边的列,并将所有0设置为1。首先,由于无法到达其下方的单元格,因此阻塞使循环中断。从索引i = 0到i <row开始,如果arr [i] [0]为0,则将其设置为1。
类似地,对从j = 0到j <col的第一行进行处理,如果arr [j] [0]为0,则将其设置为1。
再次遍历单元格(1,1)的arr,如果arr [i] [j]为-1,则不执行任何操作。
如果arr [i-1] [j]或arr [i] [j-1]大于0,则可以从它们到达arr [i] [j]。因此,为其增加价值。
最后,我们将获得arr [row-1] [col-1]作为达到它的全部方法。
如果> 0,则返回0,否则返回0。
#include<bits/stdc++.h> using namespace std; #define row 3 #define col 3 int destination_maze(int arr[row][col]) { if (arr[0][0] == -1) { return 0; } for (int i = 0; i < row; i++) { if (arr[i][0] == 0) { arr[i][0] = 1; } else { break; } } for (int i = 1; i < col; i++) { if (arr[0][i] == 0) { arr[0][i] = 1; } else { break; } } for (int i = 1; i < row; i++) { for (int j = 1; j < col; j++) { if (arr[i][j] == -1) { continue; } if (arr[i - 1][j] > 0) { arr[i][j] = (arr[i][j] + arr[i - 1][j]); } if (arr[i][j - 1] > 0) { arr[i][j] = (arr[i][j] + arr[i][j - 1]); } } } if (arr[row - 1][col - 1] > 0) { return arr[row - 1][col - 1]; } else { return 0; } } int main() { int arr[row][col] = { { 0, 0, 0 }, { -1, -1, 0 }, { 0, 0, 0 } }; cout << "在迷宫中到达目的地的方式数量如下: " << destination_maze(arr); return 0; }
如果我们运行上面的代码,它将生成以下输出-
输出结果
在迷宫中到达目的地的方式数量如下: 1