题目描述
地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子?
用回溯法:注意对于走过的位置的标示矩阵的处理
写了两种:
class Solution {
public:
bool hasPath(char* matrix, int rows, int cols, char* str) {
bool res = 0;
for (int i = 0;i<rows;++i) {
for (int j = 0;j<cols;++j) {
//bool *flag = (bool *)calloc(rows*cols, 1);
//vector<bool> flag(rows*cols,0);
bool *flag=new bool[rows*cols];
memset(flag,0,rows*cols);
res = dfs(matrix, rows, cols, i, j, flag, str);
if (res == true)
return res;
}
}
return res;
}
bool dfs(char* matrix, int rows, int cols, int i, int j, bool* flag, char* str) {
if (*(flag+i*cols + j) == 1 || (*(flag+i*cols + j) == 0 && *(matrix + i*cols + j) != *str))
return false;
else {
*(flag+i*cols + j) = 1;
if (*(str+1) == '\0')
return true;
bool res1 = 0, res2 = 0, res3 = 0, res4 = 0;
//左
if (j > 0 && j < cols)
res1 = dfs(matrix, rows, cols, i, j - 1, flag, str + 1);
//右
if (j >= 0 && j<cols - 1)
res2 = dfs(matrix, rows, cols, i, j + 1, flag, str+1);
//上
if (i>0 && i<rows)
res3 = dfs(matrix, rows, cols, i - 1, j, flag, str+1);
//下
if (i >= 0 && i<rows - 1)
res4 = dfs(matrix, rows, cols, i + 1, j, flag, str+1);
if(res1 || res2 || res3 || res4==0)
*(flag+i*cols + j)=0;
return res1 || res2 || res3 || res4;
}
}
};
参照剑指offer改了一下
class Solution {
public:
bool hasPath(char* matrix, int rows, int cols, char* str) {
bool res = 0;
bool *flag=new bool[rows*cols];
memset(flag,0,rows*cols);
for (int i = 0;i<rows;++i) {
for (int j = 0;j<cols;++j) {
//bool *flag = (bool *)calloc(rows*cols, 1);
res = dfs(matrix, rows, cols, i, j, flag, str);//1
if (res == true)
return res;
}
}
delete[] flag;
return res;
}
bool dfs(char* matrix, int rows, int cols, int i, int j, bool* flag, char* str) {
if (*str == '\0')
return true;
if(i<0||i>=rows||j<0||j>=cols)
return false;
if (*(flag+i*cols + j) == 1 || (*(flag+i*cols + j) == 0 && *(matrix + i*cols + j) != *str))
return false;
else {
*(flag+i*cols + j) = 1;
bool res=dfs(matrix, rows, cols, i, j - 1, flag, str + 1)//左
||dfs(matrix, rows, cols, i, j + 1, flag, str+1)//右
||dfs(matrix, rows, cols, i - 1, j, flag, str+1)//上
||dfs(matrix, rows, cols, i + 1, j, flag, str+1);//下
if(res==0)
*(flag+i*cols + j)=0;//这样从1处开始进入的DFS即使没找到路径,但是flag最后全部置为0
return res;
}
}
};