这道题考察的是回溯算法
具体解题方法参考剑指offer 12.
P.S.
- calloc分配内存的时间消耗很大。
- 在迭代的时候,如果返回结果是false,需要把标定清楚。
内存和时间消耗以及源代码如下:
bool existCore(char** board, int cols, int rows, char* word,
int col, int row, bool* visit, int wordnum)
{
bool end = false;
if (word[wordnum]=='\0')
{
return true;
}
if (row<0 || col<0 || row>=rows || col>=cols)
{
return false;
}
if (visit[row*cols + col])
{
return false;
}
if (board[row][col]==word[wordnum])
{
visit[row*cols + col] = true;
end = existCore(board, cols, rows, word,
col+1, row, visit, wordnum+1)||
existCore(board, cols, rows, word,
col-1, row, visit, wordnum+1)||
existCore(board, cols, rows, word,
col, row+1, visit, wordnum+1)||
existCore(board, cols, rows, word,
col, row-1, visit, wordnum+1);
}
//一旦运行失败之前的标定不能有任何变化,所以visit需要清零
if (!end)
{
visit[row*cols + col] = false;
}
return end;
}
bool exist(char** board, int boardSize, int* boardColSize, char* word){
if (board==NULL || boardSize<1 || *boardColSize<1)
{
return false;
}
else if (word == NULL)
{
return true;
}
int col;
int row;
int cols = *boardColSize;
int rows = boardSize;
bool* visit;
visit = (bool*)malloc(cols*rows*sizeof(bool));
// //visis可以用0or1来标定,这样可以直接用calloc来赋值,但是时间消耗很长
// int* visit;
int wordnum;
for (row=0; row<rows; row++)
{
for (col=0; col<cols; col++)
{
wordnum = 0;
// visit = (int*)calloc(cols*rows,sizeof(int));
for (int i=0; i<rows; i++)
{
for (int j=0; j<cols; j++)
{
visit[i*cols + j] = false;
}
}
if (existCore(board, cols, rows, word, col,
row, visit, wordnum))
{
return true;
}
}
}
return false;
}