递归题,在每个点有若干种走法,都走一走看看
class Solution {
public:
/*
1 0 0 0
0 0 0 0
0 0 2 -1
*/
// 只能走四个方向,从1走到2, 每个0走过不能再走了,-1不用走,返回有几种走的形式
// 1 2也是只能走一次,必须是路径的开头和结尾
/*
0 1
2 0
*/
// 感觉是个递归题
void func(vector<int>& start, vector<int>& end, vector<vector<int>>& visit, int& res){
int row = visit.size();
int col = visit[0].size();
int x = start[0];
int y = start[1];
// judge when res ++;
if (start[0]==end[0]&&start[1]==end[1]){
int flag = 0;
for(int i=0;i<row;i++){
for (int j=0;j<col;j++){
if (visit[i][j]==0){
flag = 1;
break;
}
}
if (flag==1){break;}
}
if (flag==0){res ++;}
return;
}
// next points
vector<int> left = {x, y-1};
if (left[0]>=0&&left[0]<row&&left[1]>=0&&left[1]<col&&visit[left[0]][left[1]]!=-1){
visit[left[0]][left[1]]=-1;
func(left, end, visit, res);
visit[left[0]][left[1]]=0;
}
vector<int> right = {x, y+1};
if (right[0]>=0&&right[0]<row&&right[1]>=0&&right[1]<col&&visit[right[0]][right[1]]!=-1){
visit[right[0]][right[1]]=-1;
func(right, end, visit, res);
visit[right[0]][right[1]]=0;
}
vector<int> up = {x-1, y};
if (up[0]>=0&&up[0]<row&&up[1]>=0&&up[1]<col&&visit[up[0]][up[1]]!=-1){
visit[up[0]][up[1]]=-1;
func(up, end, visit, res);
visit[up[0]][up[1]]=0;
}
vector<int> down = {x+1, y};
if (down[0]>=0&&down[0]<row&&down[1]>=0&&down[1]<col&&visit[down[0]][down[1]]!=-1){
visit[down[0]][down[1]]=-1;
func(down, end, visit, res);
visit[down[0]][down[1]]=0;
}
}
int uniquePathsIII(vector<vector<int>>& grid) {
vector<int> start(2,-1);
vector<int> end(2,-1);
for(int i=0;i<grid.size();i++){
for(int j=0;j<grid[0].size();j++){
if (grid[i][j]==1){
start[0] = i;
start[1] = j;
grid[i][j] = -1;
}
if (grid[i][j]==2){
end[0] = i;
end[1] = j;
grid[i][j] = 0;
}
}
}
int res = 0;
func(start, end, grid, res);
return res;
}
};