資料結構與演算法分析(c 語言描述)習題 1.2

jerrkill發表於2018-12-14
/**
 * 編寫一個程式求解字謎遊戲問題。
 *
 * 描述:輸入是由一些字母和單詞構成的二維陣列,目標是找出字謎中的單詞,這些單詞可以是水平、垂直或沿對角線以任何方向放置。找出二維陣列中所有的單詞
 *
 */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// 字典
char puzzle[4][4] = {
    {'t','h','i','s'},
    {'w','a','t','s'},
    {'o','a','h','g'},
    {'f','g','g','t'}
};

// 單詞
char *dict[4] = {"this", "tow", "fat", "that"};

int word_exist(int x, int y, int direction, int strlen, char *word);

int main(void)
{
    char word[5];
    int x, y, direction, strlen;

    for (x = 0; x < 4; x++) {
        for (y = 0; y < 4; y++) {
            for (direction = 0; direction < 8; direction++) {
                for (strlen = 2; strlen <= 4; strlen++) {
                    if (word_exist(x, y, direction, strlen, word) == 1) {
                        printf("word:%s\n", word);
                        break;
                    }
                }
            }
        }
    }

    return 0;
}

// 查詢單詞
int word_exist(int x, int y, int direction, int strlen, char *word)
{
    // 單詞長度從2開始分別向不同方向去找
    char sword[5];
    int i = 0, j;
    while(i < strlen) {
        sword[i] = puzzle[x][y];
        sword[i + 1] = '\0';
        i++;
        //遍歷規則
        switch (direction){
            case 0:     //從左往右
                y++;
                break;
            case 1:     //從右往左
                y--;
                break;
            case 2:     //從上往下
                x++;
                break;
            case 3:     //從下往上
                x--;
                break;
            case 4:     //從左上往右下
                y++;
                x++;
                break;
            case 5:     //從右下往左上
                y--;
                x--;
                break;
            case 6:     //從右上往左下
                y--;
                x++;
                break;
            case 7:     //從左下往右上
                y++;
                x--;
                break;
            default:
                puts("Direction error");
                return 0;
        }
        if (x < 0 || y < 0) {
            for (j = 0; j < 4; j++) {
                if (strcmp(sword, dict[j]) == 0) {
                    strcpy(word, dict[j]);
                    return 1;
                }
            }
            return 0;
        }
    }
    // 與詞典比較
    for (j = 0; j < 4; j++) {
        if (strcmp(sword, dict[j]) == 0) {
            strcpy(word, dict[j]);
            return 1;
        }
    }
    return 0;
}

高度自律,深度思考,以勤補拙

相關文章