/*
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\n");
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\n",rs);
return 0;
}