分析:路径选择,一定是在上下左右中选择一条,如果存在路径的话,对每一条可行的路径进行测试;如果都不可选择的话,则不存在路径。
从第一步开始,每一步,其下一步该往哪走都是固定不变的,一定是上下左右中的一种。只是我们并不知道究竟是哪一个,所以需要进行比较,找到符合条件的位置(如果存在的话)。找到后,再找下一个,如此往复。
//helper()的作用是进入下一个位置,但是并不知道下一个位置是否合法
//x,y是当前位置,dir 是上一个位置到达x, y所走的方向
bool helper(int** grid, int gridSize, int* gridColSize, int x, int y, int dir){
//注意数组越界
if (x >= gridSize || y >= gridColSize[0]
|| x < 0 || y < 0)
return false;
//到达右下角,仍需进行判断
if (x == gridSize - 1 && y == gridColSize[0] - 1){
if (dir == 0)
return grid[x][y] == 1 || grid[x][y] == 3 || grid[x][y] == 5;
else if (dir == 1)
return grid[x][y] == 2 || grid[x][y] == 5 || grid[x][y] == 6;
return false;
}
//向右
//寻找能够与往右方向进行衔接的节点
//如果不能衔接,直接返回false
if (dir == 0) {
if (grid[x][y] == 1)
return helper(grid, gridSize, gridColSize, x, y + 1, 0);
else if (grid[x][y] == 3)
return helper(grid, gridSize, gridColSize, x + 1, y, 1);
else if (grid[x][y] == 5)
return helper(grid, gridSize, gridColSize, x - 1, y, 3);
return false;
}
//向下
if (dir == 1) {
if (grid[x][y] == 2)
return helper(grid, gridSize, gridColSize, x + 1, y, 1);
else if (grid[x][y] == 5)
return helper(grid, gridSize, gridColSize, x, y - 1, 2);
else if (grid[x][y] == 6)
return helper(grid, gridSize, gridColSize, x, y + 1, 0);
return false;
}
//向左
if (dir == 2) {
if (grid[x][y] == 1)
return helper(grid, gridSize, gridColSize, x, y - 1, 2);
else if (grid[x][y] == 4)
return helper(grid, gridSize, gridColSize, x + 1, y, 1);
else if (grid[x][y] == 6)
return helper(grid, gridSize, gridColSize, x - 1, y, 3);
return false;
}
//向上
if (dir == 3) {
if (grid[x][y] == 2)
return helper(grid, gridSize, gridColSize, x - 1, y, 3);
else if (grid[x][y] == 3)
return helper(grid, gridSize, gridColSize, x, y - 1, 2);
else if (grid[x][y] == 4)
return helper(grid, gridSize, gridColSize, x, y + 1, 0);
return false;
}
return false;
}
bool hasValidPath(int** grid, int gridSize, int* gridColSize)
{
if (grid == NULL || gridSize < 1 || gridColSize == NULL || gridColSize[0] < 1) {
return false;
}
if (gridSize == 1 && gridColSize[0] == 1) {
return true;
}
if (grid[0][0] == 5) {
return false;
}
//在左上角开始时,只有3种选择:只能向下、只能向右、既能向下又能向右
//1.向右
if (grid[0][0] == 1 || grid[0][0] == 6)
return helper(grid, gridSize, gridColSize, 0, 1, 0);
//2.向下
else if (grid[0][0] == 2 || grid[0][0] == 3)
return helper(grid, gridSize, gridColSize, 1, 0, 1);
//3.向下和向右
return helper(grid, gridSize, gridColSize, 0, 1, 0)
|| helper(grid, gridSize, gridColSize, 1, 0, 1);
}