单词搜索

给定一个二维网格和一个单词,找出该单词是否存在于网格中。

单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。

示例:

board =
[
  ['A','B','C','E'],
  ['S','F','C','S'],
  ['A','D','E','E']
]

给定 word = "ABCCED", 返回 true.
给定 word = "SEE", 返回 true.
给定 word = "ABCB", 返回 false.

 

一开始只写了向四周搜索的递归,但是哪有那么简单。。由于正确的路径每个方向都有可能,所以需要用到回溯,即完成某个点后面的递归,要把它重新设为未访问过。

 

void search(char** board,char* word,int** visited,int index,int x,int y,int row,int col,int n,bool* flag)
{
    if(index==n)
    {
        *flag=true;
        return ;
    }
    if(x<0||y<0||x==row||y==col||visited[x][y]||board[x][y]!=word[index]||*flag)
        return;
    visited[x][y]=1;
    search(board,word,visited,index+1,x+1,y,row,col,n,flag);
    search(board,word,visited,index+1,x-1,y,row,col,n,flag);
    search(board,word,visited,index+1,x,y+1,row,col,n,flag);
    search(board,word,visited,index+1,x,y-1,row,col,n,flag);
    visited[x][y]=0;
}
bool exist(char** board, int boardRowSize, int boardColSize, char* word) {
    int i,j,n=strlen(word);
    bool flag=false;
    int **visited=(int **)malloc(sizeof(int *)*boardRowSize);
    for(i=0;i<boardRowSize;i++)
        visited[i]=(int *)malloc(sizeof(int)*boardColSize);
    for(i=0;i<boardRowSize;i++)
        for(j=0;j<boardColSize;j++)
            visited[i][j]=0;
    for(i=0;i<boardRowSize;i++)
        for(j=0;j<boardColSize;j++)
        {
            if(board[i][j]==word[0])
            {
                search(board,word,visited,0,i,j,boardRowSize,boardColSize,n,&flag);
                if(flag)
                    return flag;
            }
        }
    return flag;
}

给定一个二维网格和一个单词,找出该单词是否存在于网格中。

单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。

示例:

board =
[
  ['A','B','C','E'],
  ['S','F','C','S'],
  ['A','D','E','E']
]

给定 word = "ABCCED", 返回 true.
给定 word = "SEE", 返回 true.
给定 word = "ABCB", 返回 false.
posted @ 2018-07-18 20:51  onlyandonly  阅读(553)  评论(0编辑  收藏  举报