leetcode-79

时间:2021-01-12
本文章向大家介绍leetcode-79,主要包括leetcode-79使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

题目网址

解法:

bool exist(char** board, int boardSize, int* boardColSize, char * word){
    int wordlength = 0;
    while(word[wordlength] != '\0'){
        wordlength++;
    }
    // 设好了wordlength,接下来设一个坐标表
    bool found[wordlength];
    int co1[wordlength];
    int co2[wordlength];
    int flag = 0;
    for(int i = 0; i <wordlength; i++){
        co1[i] = -1;
        co2[i] = -1;
        found[i] = false;
    }
    // 接下来设一个与board同大小的布尔表,用来表示board同位置的字母是否被用过
    bool* boolboard[boardSize];
    for(int x = 0; x <boardSize; x++){
        boolboard[x] = (bool *)malloc(sizeof(bool) * boardColSize[x]);
    }//为每个小表申请空间
    for(int x = 0; x <boardSize; x++){
        for(int y =0; y <boardColSize[x];y++){
            boolboard[x][y] = false;
        }
    }//将所有表都设为false
    void filltrue(int x, int y){
        boolboard[x][y] = true;
    }
    void fillfalse(int x, int y){
        boolboard[x][y] = false;
    }
    bool checkbool(int x, int y){
        return boolboard[x][y];
    }
    void fillco(int x, int y){
        if (flag==wordlength)
            return;
        co1[flag] = x;
        co2[flag] = y;
        found[flag] = true;
        flag++;
        filltrue(x,y);
    }
    void deleteco(){
        flag--;
        found[flag] = false;
        fillfalse(co1[flag],co2[flag]);
        co1[flag] = -1;
        co2[flag] = -1;
    }
    bool check(int now, int x,int y){
        return (board[x][y] == word[now]);
    }
    void initboard(){
        while(flag!=0){
            deleteco();
        }
    }
// 套娃函数
// 为的是在x,y周围找到index为now的字母
    void taowa(int now, int x, int y){
// x+1阶段
        if (flag == wordlength)
            return;
        while (flag>now){
            deleteco();
        }
        if (x+1 < boardSize){
            if( (check(now,x+1,y))&& !checkbool(x+1,y) ){
                fillco(x+1,y);
                taowa(now+1,x+1,y);
            }
        }
// x-1阶段
        if (flag == wordlength)
            return;
        while (flag>now){
            deleteco();
        }
        if (x-1 >=0){
            if( (check(now,x-1,y))&& !checkbool(x-1,y) ){
                fillco(x-1,y);
                taowa(now+1,x-1,y);
            }
        }
// y+1阶段
        if (flag == wordlength)
            return;
        while (flag>now){
            deleteco();
        }
        if(y+1 <boardColSize[x]){
            if( (check(now,x,y+1)) && !checkbool(x,y+1)){
                fillco(x,y+1);
                taowa(now+1,x,y+1);
            }
        }
// y-1阶段
        if (flag == wordlength)
            return;
        while (flag>now){
            deleteco();
        }
        if(y-1 >=0 ){
            if( (check(now,x,y-1)) && !checkbool(x,y-1)){
                fillco(x,y-1);
                taowa(now+1,x,y-1);
            }
        }
    }
// 流程分为两步
// 1. 找到第一个字母
// 2. 开始套娃找下一个字母
    for(int x = 0; x <boardSize; x++){
        for(int y =0; y <boardColSize[x];y++){
            initboard();
            if (check(0,x,y)){
                fillco(x,y);
                taowa(1,x,y);
            }
            if(flag == wordlength)
                return true;
        }
    }
    return false;
}