《数据结构与算法分析-C语言描述》中的字谜问题

通过将已知单词表中的单词存到Hash表中来提高查找效率

还可以将单词表中单词的前缀也存入Hash表中再提高效率

以下代码仅将单词存入Hash表

#include "HashQuad.h"
#include <stdio.h>
#include <ctype.h>
#include "Fatal.h"

#define MaxWordLen (4)  //已知单词最大长度为4
#define ROW (4) //4行
#define COLUMN (4)  //4列

void LoadWords(FILE*, HashTable);

int
main()
{
    int i, j;
	HashTable WordsTable = InitializeTable(10);
	FILE* fp = fopen("wordsfile.txt","r");
    //文件内容:this two fat that
	if(fp == NULL)
	{
		FatalError("File open failed");
	}
    
    //将单词表录入散列表中
    LoadWords(fp, WordsTable);
    printf("Loding Completed\n");
    
    char grids[COLUMN][ROW] = { 't','h','i','s',
                                'w','a','t','s',
                                'o','a','h','g',
                                'f','g','d','t' };
    
    for(i = 0; i < ROW; i++)
    {
        for(j = 0; j < COLUMN; j++)
        {
            int n = 1;
            char word[MaxWordLen+1];
            word[0] = grids[i][j];
            //1、横向向右
            while((j+n) < COLUMN && n < MaxWordLen)
            {
                word[n] = grids[i][j+n];
                word[++n] = '\0';
                if(!IsEmpty(Find(word, WordsTable), WordsTable))
                {
                    printf("'%s' exist : from (%d,%d) to (%d,%d)\n",word,i+1,j+1,i+1,j+n);
                    break;
                }
            }
            n = 1;
            //2、横向向左
            while((j-n)>-1 && n < MaxWordLen)
            {
                word[n] = grids[i][j-n];
                word[++n] = '\0';
                if(!IsEmpty(Find(word, WordsTable), WordsTable))
                {
                    printf("'%s' exist : from (%d,%d) to (%d,%d)\n",word,i+1,j+1,i+1,j-n);
                    break;
                }
            }
            n = 1;
            //3、纵向向上
            while((i-n)>-1 && n < MaxWordLen)
            {
                word[n] = grids[i-n][j];
                word[++n] = '\0';
                if(!IsEmpty(Find(word, WordsTable), WordsTable))
                {
                    printf("'%s' exist : from (%d,%d) to (%d,%d)\n",word,i+1,j+1,i-n,j+1);
                    break;
                }
            }
            n = 1;
            //4、纵向向下
            while((i+n)<ROW && n < MaxWordLen)
            {
                word[n] = grids[i+n][j];
                word[++n] = '\0';
                if(!IsEmpty(Find(word, WordsTable), WordsTable))
                {
                    printf("'%s' exist : from (%d,%d) to (%d,%d)\n",word,i+1,j+1,i+n,j+1);
                    break;
                }
            }
            n = 1;
            //5、主对角线向上
            while((i-n)>-1 && (j-n)>-1 && n < MaxWordLen)
            {
                word[n] = grids[i-n][j-n];
                word[++n] = '\0';
                if(!IsEmpty(Find(word, WordsTable), WordsTable))
                {
                    printf("'%s' exist : from (%d,%d) to (%d,%d)\n",word,i+1,j+1,i-n+2,j-n+2);
                    break;
                }
            }
            n = 1;
            //6、主对角线向下
            while((i+n)<ROW && (j+n)<COLUMN && n < MaxWordLen)
            {
                word[n] = grids[i+n][j+n];
                word[++n] = '\0';
                if(!IsEmpty(Find(word, WordsTable), WordsTable))
                {
                    printf("'%s' exist : from (%d,%d) to (%d,%d)\n",word,i+1,j+1,i+n,j+n);
                    break;
                }
            }
            n = 1;
            //7、副对角线向上
            while((i-n)>-1 && (j+n)<COLUMN && n < MaxWordLen)
            {
                word[n] = grids[i-n][j+n];
                word[++n] = '\0';
                if(!IsEmpty(Find(word, WordsTable), WordsTable))
                {
                    printf("'%s' exist : from (%d,%d) to (%d,%d)\n",word,i+1,j+1,i-n+2,j+n);
                    break;
                }
            }
            n = 1;
            //8、副对角线向下
            while((i+n)<ROW && (j-n)>-1 && n < MaxWordLen)
            {
                word[n] = grids[i+n][j-n];
                word[++n] = '\0';
                if(!IsEmpty(Find(word, WordsTable), WordsTable))
                {
                    printf("'%s' exist : from (%d,%d) to (%d,%d)\n",word,i+1,j+1,i+n,j-n+2);
                    break;
                }
            }
            
        }
    }
	return 0;
}

void
LoadWords(FILE *fp, HashTable WordsTable)
{
    char c;
    char temp[MaxWordLen+1];
    int i = 0;
    while(1)
    {
        c = fgetc(fp);
        if(isalpha(c))
        {
            temp[i] = c;
            i++;
        }
        else
        {
            temp[i] = '\0';
            Insert(temp, WordsTable);
            i = 0;
            if(c == EOF)
                break;
        }
        
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值