记录一次解题过程,矩阵中的路径

题目

请设计一个函数,用来推断在一个矩阵中是否存在一条包括某字符串全部字符的路径。路径能够从矩阵中随意一格開始。每一步能够在矩阵中间向左、右、上、下移动一格。假设一条路径经过了矩阵的某一格,那么该路径不能再次进入该格子。

如下

比如在以下的3*4的矩阵中包括一条字符串”bcced”的路径。

但矩阵中不包括字符串“abcb”的路径,因为字符串的第一个字符b占领了矩阵中的第一行第二格子之后,路径不能再次进入这个格子。

a b c e
s f c s
a d e e

思路

本来思路很简单,递归深度优先遍历搜索,然而在递归结束判定的时候把条件先后位置写错了两次,在发现这两此bug之前死活都调不出来,然后去github上下载了源码还把源码敲了一遍,突然再次看自己写的代码就发现了问题所在…

浪费了很多时间,十分的蛋疼…

错误代码和调整后的代码总结如下:,,,

#include<stdio.h>
#include<string.h>


//总结: 递归一定注意递归结束条件的先后顺序!!!!
bool CheckOutPath(const char matrix[][4],int rows,int cols, int pos_r,int pos_c, const char* msg,bool visitedPoint[][4])
{
  // 错误 这里如果 没判断该点是否走过就reutrn  baa 通过
  //if(*msg == '\0')
  //{
    //printf(" find a path\n");
    //return true;
  //}
  //bool hasPath = false;
  if(pos_r == rows || pos_c ==cols || pos_r < 0 || pos_c < 0) 
  {
    return false;
  }
  if(visitedPoint[pos_r][pos_c] == true)
    return false;
  visitedPoint[pos_r][pos_c] = true;
  if(*msg == '\0')
  {
    printf(" find a path\n");
    return true;
  }
  if(matrix[pos_r][pos_c] != *msg)
  {
    return false;
  }
  // 犯错,  如果此时msg 等于 0,会先判断上面那个if return false
  //if(*msg == '\0')
  //{
    //printf(" find a path\n");
    //return true;
  //}
if( CheckOutPath(matrix,rows,cols,pos_r + 1,pos_c,msg + 1,visitedPoint) || CheckOutPath(matrix,rows,cols,pos_r ,pos_c + 1,msg + 1,visitedPoint) ||
    CheckOutPath(matrix,rows,cols,pos_r - 1,pos_c,msg + 1,visitedPoint) || CheckOutPath(matrix,rows,cols,pos_r - 1,pos_c,msg - 1,visitedPoint)) 
  //只要一个方向 true 回溯过程都会return true
    return true;
  return false;
}
//原来的代码
bool hasPathCore(const char matrix[][4],int rows,int cols, int row,int col, const char* msg,int& length,bool visitedPoint[][4])
{
  if(msg[length] == '\0')
  {
    return true;
  }
  bool hasPath = false;
  if(row >= 0 && row < rows && col >= 0
      && col < cols && matrix[row][col] == msg[length]  
      &&!visitedPoint[row][ col])
  {
      ++length;
      visitedPoint[row][col]= true;
    hasPath = hasPathCore(matrix,rows,cols,row,col-1,msg,length,visitedPoint) || hasPathCore(matrix,rows,cols,row - 1,col,msg,length,visitedPoint)||
      hasPathCore(matrix,rows,cols,row,col+1,msg,length,visitedPoint)||hasPathCore(matrix,rows,cols,row+1,col,msg,length,visitedPoint)  ;
    if(!hasPath)
    {
      --length;
      visitedPoint[row][col] = false;
    }
  }
  return hasPath;
}

bool HasPath(const char matrix[][4],int rows,int cols,const char* msg)
{
  //合法检测
  //找入口
  int i = 0;
  int j = 0;
  bool visitedPoint[rows][4];
  //memset(visitedPoint,0,sizeof(visitedPoint));
 int length = 0; 
  for(; i < rows;i++)
  {
   for(; j < cols; j++)
   {
     if(matrix[i][j] == *msg)
     {
      memset(visitedPoint,0,sizeof(visitedPoint));
      bool ret  = CheckOutPath(matrix,rows,cols,i,j,msg,visitedPoint);
         //这个是原来的代码
      //bool ret = hasPathCore(matrix,rows,cols,i,j,msg,length,visitedPoint);
      if(ret == true)
        return true;
     }
   }
  }
  return false;
}
int main()
{
  char* msg = "abc";
  const char matrix[][4] = 
  {
    {'a','b','c','d' },
    {'e','f','g','h' },
    {'i','g','k','l' },
    {'m','n','o','p' },
  };
  bool ret = HasPath( matrix,3,4,msg);
  printf("%d",ret);
}

猜你喜欢

转载自blog.csdn.net/kwinway/article/details/80726910