79.单词搜索

/*
79. 单词搜索
给定一个二维网格和一个单词,找出该单词是否存在于网格中。
单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。
*/
#include<stdio.h>
#include<malloc.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#include<string.h>
#include<iostream>
#define DIR 4
int direction[DIR][2]={{1,0},{-1,0},{0,1},{0,-1}};

int dfs(char** board, int m, int n, int i,int j,char * word,int depth,int** visited){
    if(depth==strlen(word))
        return 1;
    if(i<0||i>=m||j<0||j>=n)
        return 0;
    if(visited[i][j]||board[i][j]!=word[depth])
        return 0;
    visited[i][j]=1;
    for(int k=0;k<DIR;k++){
        int new_x = i + direction[k][0];
        int new_y = j + direction[k][1];

        if(dfs(board,m,n,new_x,new_y,word,depth+1,visited))
            return 1;
    }
    visited[i][j]=0;
    return 0;
}

bool exist(char** board, int boardSize, int* boardColSize, char * word){

    int m=boardSize,n=*boardColSize,i,j;
    int** visited=(int**)calloc(sizeof(int*),m);
    for(i=0;i<m;i++){
        visited[i]=(int*)calloc(sizeof(int),n);
    }
    for(i=0;i<m;i++){
        for(j=0;j<n;j++){
            if(dfs(board,m,n,i,j,word,0,visited)){
                printf("1
");
                return 1;
            }
        }
    }
    return 0;
}

int main()
{
    char **board=(char**)malloc(sizeof(char*)*100),str[3][4]={{'A','B','C','E'},{'S','F','C','S'},{'A','D','E','E'}};
    int i,boardSize=3,*boardColSize=(int*)malloc(sizeof(int));
    *boardColSize=4;
    char word[6]={'A','B','C','C','E','D'};
    for(i=0;i<boardSize;i++){
        board[i]=str[i];
    }
    bool rs = exist(board,boardSize,boardColSize,word);
    printf("%d
",rs);
    return 0;
}
原文地址:https://www.cnblogs.com/zhaohuan1996/p/12841749.html