From ba41477c922ad4efab41a5f9300f576cc8a5cf8a Mon Sep 17 00:00:00 2001 From: Leo Ma Date: Mon, 28 Aug 2017 09:37:03 +0800 Subject: [PATCH] Word search Signed-off-by: Leo Ma --- 079_word_search/Makefile | 2 ++ 079_word_search/word_search.c | 66 +++++++++++++++++++++++++++++++++++ 2 files changed, 68 insertions(+) create mode 100644 079_word_search/Makefile create mode 100644 079_word_search/word_search.c diff --git a/079_word_search/Makefile b/079_word_search/Makefile new file mode 100644 index 0000000..99bef24 --- /dev/null +++ b/079_word_search/Makefile @@ -0,0 +1,2 @@ +all: + gcc -O2 -o test word_search.c diff --git a/079_word_search/word_search.c b/079_word_search/word_search.c new file mode 100644 index 0000000..54cae5d --- /dev/null +++ b/079_word_search/word_search.c @@ -0,0 +1,66 @@ +#include +#include +#include +#include + +static bool recursive(char *word, char **board, bool *used, int row, int col, int row_size, int col_size) +{ + if (board[row][col] != *word) { + return false; + } + + used[row * col_size + col] = true; + + if (*(word + 1) == '\0') { + return true; + } + + bool result = false; + if (row > 0 && !used[(row - 1) * col_size + col]) { + result = recursive(word + 1, board, used, row - 1, col, row_size, col_size); + } + + if (!result && row < row_size - 1 && !used[(row + 1) * col_size + col]) { + result = recursive(word + 1, board, used, row + 1, col, row_size, col_size); + } + + if (!result && col > 0 && !used[row * col_size + col - 1]) { + result = recursive(word + 1, board, used, row, col - 1, row_size, col_size); + } + + if (!result && col < col_size - 1 && !used[row * col_size + col + 1]) { + result = recursive(word + 1, board, used, row, col + 1, row_size, col_size); + } + + used[row * col_size + col] = false; + return result; +} + +static bool exist(char** board, int boardRowSize, int boardColSize, char* word) { + int i, j; + int len = strlen(word); + if (len > boardRowSize * boardColSize) { + return false; + } + bool *used = malloc(boardRowSize * boardColSize); + for (i = 0; i < boardRowSize; i++) { + for (j = 0; j < boardColSize; j++) { + memset(used, false, boardRowSize * boardColSize); + if (recursive(word, board, used, i, j, boardRowSize, boardColSize)) { + return true; + } + } + } + return false; +} + +int main(int argc, char **argv) +{ + if (argc < 3) { + fprintf(stderr, "Usage: ./test word row1 row2...\n"); + exit(-1); + } + printf("%s\n", exist(argv + 2, argc - 2, strlen(argv[2]), argv[1]) ? "true" : "false" +); + return 0; +}