题解 | #牛群定位系统#

牛群定位系统

https://www.nowcoder.com/practice/d808aaa4c13c4d38bff333aa796e6a1e

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 *
 * @param board char字符型二维数组
 * @param boardRowLen int board数组行数
 * @param boardColLen int* board数组列数
 * @param words string字符串一维数组
 * @param wordsLen int words数组长度
 * @return string字符串一维数组
 * @return int* returnSize 返回数组行数
 */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void dfs(char** board, int m, int n, int i, int j, int current, char* word,
         int** visited, int* flag) {
    if (i < 0 || j < 0 || i >= m || j >= n || visited[i][j] ||
            board[i][j] != word[current]) return;
    if (current + 1 == strlen(word)) {
        (*flag) = 1;
        return;
    }
    visited[i][j] = 1;
    dfs(board, m, n, i + 1, j, current + 1, word, visited, flag);
    dfs(board, m, n, i - 1, j, current + 1, word, visited, flag);
    dfs(board, m, n, i, j + 1, current + 1, word, visited, flag);
    dfs(board, m, n, i, j - 1, current + 1, word, visited, flag);
    visited[i][j] = 0;
}

void clearVisit(int** visited, int m, int n) {
    for (int i = 0; i < m; i++) memset(visited[i], 0, sizeof(int)*n);
}

char** findWords(char** board, int boardRowLen, int* boardColLen, char** words,
                 int wordsLen, int* returnSize ) {
    int m = boardRowLen, n = boardColLen[0];
    *returnSize = 0;
    char** res = malloc(sizeof(char*)*wordsLen);
    int** visited = malloc(sizeof(int*)*m);
    
    for (int i = 0; i < m; i++) {
        visited[i] = malloc(sizeof(int) * n);
        memset(visited[i], 0, sizeof(int)*n);
    }
    
    int flag, current, temp;
    for (int i = 0; i < wordsLen; i++) {
        for (int j = 0; j < m; j++) {
            temp = 0;
            for (int k = 0; k < n; k++) {
                if (board[j][k] == words[i][0]) {
                    flag = 0;
                    current = 0;
                    dfs(board, m, n, j, k, current, words[i], visited, &flag);
                    if (flag == 1) {
                        res[(*returnSize)] = malloc(sizeof(char) * (strlen(words[i]) + 2));
                        strcpy(res[(*returnSize)++], words[i]);
                        temp = 1;
                        break;
                    }
                }
            }
            if (temp) break;
        }
        clearVisit(visited, m, n);
    }
    return res;
}

全部评论

相关推荐

10-15 03:05
门头沟学院 Java
CADILLAC_:凯文:我的邮箱是死了吗?
点赞 评论 收藏
分享
10-11 17:30
湖南大学 C++
我已成为0offer的糕手:羡慕
点赞 评论 收藏
分享
蚂蚁 基架java (n+6)*16 签字费若干
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务