classSolution{public:// 全局变量bool visit[7][7];int m, n;boolexist(vector<vector<char>>& board, string word){
m = board.size();// 总共有多少行
n = board[0].size();// 一行有多少个for(int i =0; i < m; i++){for(int j =0; j < n; j++){// 匹配if(word[0]== board[i][j]){
visit[i][j]=true;// 标记该点已经被访问过了if(dfs(board, i, j, word,1/*从第一个位置往下走*/))returntrue;// 递归到下一层
visit[i][j]=false;// 第一个点位置错误,找下一个第一个对应的点}}}returnfalse;// 没有访问到}// 定义一个上下左右移动的向量int dx[4]={0,0,-1,1};// x x x-1 x+1int dy[4]={1,-1,0,0};// y+1 y-1 y ybooldfs(vector<vector<char>>& board,int i,int j, string word,int pos){// 递归出口if(pos == word.size()){returntrue;}for(int k =0; k <4; k++){int x = dx[k]+ i;// x坐标int y = dy[k]+ j;// y坐标// 不越界,当前visit数组未被访问过,当前字符和word相对应字符相同if(x >=0&& x < m && y >=0&& y < n && visit[x][y]==false&& word[pos]== board[x][y]){
visit[x][y]=true;// 先定义到访问过if(dfs(board, x, y, word, pos +1))returntrue;// 递归下一层
visit[x][y]=false;// 恢复现场}}returnfalse;}};
classSolution{public:// 全局变量int m, n;bool visit[21][21];// 用来记录位置是否被访问过int dx[4]={0,0,1,-1};int dy[4]={1,-1,0,0};int ret;// 统计总路数int step;// 记录总共有几个0intuniquePathsIII(vector<vector<int>>& grid){
m = grid.size();// 行
n = grid[0].size();// 列int x =0;// 记录1的横坐标int y =0;// 记录1的纵坐标for(int i =0; i < m; i++){for(int j =0; j < n; j++){if(grid[i][j]==0){
step++;// 统计有几个0}elseif(grid[i][j]==1)// 找到开头{
x = i;
y = j;}}}
step +=2;// 包含上首尾
visit[x][y]=true;// 标记一下当前位置被使用过dfs(grid, x, y,1);// 从第一层开始往后递归return ret;}voiddfs(vector<vector<int>>& grid,int i,int j,int count/*用来记录每一条路线的0的个数*/){// 递归出口if(grid[i][j]==2){if(count == step){
ret++;}return;}for(int k =0; k <4; k++){int x = i + dx[k];int y = j + dy[k];if(x >=0&& x < m && y >=0&& y < n &&!visit[x][y]&& grid[x][y]!=-1){
visit[x][y]=true;dfs(grid, x, y, count +1);
visit[x][y]=false;}}}};