1.矩阵中的路径
思路:回溯
class Solution {
public:
bool hasPath(char* matrix, int rows, int cols, char* str)
{
if(matrix==nullptr||rows<1||cols<1||str==nullptr)
return false;//特殊情况
bool *visited=new bool[rows*cols];//标记走过的地点
memset(visited,0,rows*cols);//visit矩阵都设为零
int pathLength=0;//字符串计数
for(int row=0;row<rows;++row)
{
for(int col=0;col<cols;++col)
{
if(hashPathCore(matrix,rows,cols,row,col,str,pathLength,visited))
{
return true;
}
}
}
delete[] visited;
return false;
}
//回溯算法
bool hashPathCore(const char* matrix,int rows,int cols,int row,int col,
const char* str,int &pathLength,bool *visited)
{
if(str[pathLength]=='\0')
return true;//找到符合要求的路径,则直接返回true
bool hasPath=false;
if(row>=0&&row<rows&&col>=0&&col<cols&&matrix[row*cols+col]==str[pathLength]
&&!visited[row*cols+col])
{
++pathLength;//如果row,col点符合要求,那么pathLength加一
visited[row*cols+col]=true;//标记走过了
hasPath=hashPathCore(matrix,rows,cols,row,col-1,str,pathLength,visited)||
hashPathCore(matrix,rows,cols,row-1,col,str,pathLength,visited)||
hashPathCore(matrix,rows,cols,row,col+1,str,pathLength,visited)||
hashPathCore(matrix,rows,cols,row+1,col,str,pathLength,visited);
//如果row,col点和pathlength是一致的,那么就从他的上下左右找符合pathlength+1的字符
if(!hasPath)
{
--pathLength;
visited[row*cols+col]=false;//如果不符合要求,回溯到上一点,把visited重置
}
}
return hasPath;
}
};2.机器人的运动范围
地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子?
class Solution {
public:
int movingCount(int threshold, int rows, int cols)
{
if(threshold<0||rows<=0||cols<=0)
return 0;//特殊情况
vector<bool> visited(rows*cols,false);
int count=Count(threshold,0,0,rows,cols,visited);
return count;
}
int Count(int threshold,int row,int col,int rows,int cols,vector<bool>& visited)
{
int count=0;
if(check(threshold,row,col,rows,cols,visited))
{
visited[row*cols+col]=true;
count=1+Count(threshold,row+1,col,rows,cols,visited)+
Count(threshold,row,col+1,rows,cols,visited)+
Count(threshold,row-1,col,rows,cols,visited)+
Count(threshold,row,col-1,rows,cols,visited);
}
return count;
}
bool check(int threshold,int row,int col,int rows,int cols,vector<bool>& visited)
{
if(row>=0&&row<rows&&col>=0&&col<cols&&!visited[row*cols+col]&&
Sum(row)+Sum(col)<=threshold)
return true;
return false;
}
int Sum(int number)
{
int sum=0;
while(number>0)
{
sum+=number%10;
number/=10;
}
return sum;
}
};
京公网安备 11010502036488号