作业帮 > 综合 > 作业

C语言题目,求思路求指导

来源:学生作业帮 编辑:作业帮 分类:综合作业 时间:2024/05/15 18:37:14
C语言题目,求思路求指导
我需要编一个程序
给两个Txt文档 一个内容是 4乘4的英文字母矩阵,另一个是一个dic字典文件
要求程序能够找出字母矩阵中所有可以组成的单词(类似Ruzzle游戏),相邻的字母可以连接组成单词(上下左右 左上左下右上右下 8个方向)是否为有效单词要通过跟词典文件比较
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define N 400000
#define L 6
#define BUFF_LEN 150
void insert(char *s);
int find(char *s);
int num=0,root=0,cid=0;
struct Trie
{
    int id;
    int cnt;
    int next[27];
}tree[N];
int main()
{
    FILE *fp1;
    int i,sl,word_num,cur_num;
    char s[BUFF_LEN],d[L]={'a','b','a','c','o','\0'};
    fp1=fopen("dic.txt","r");
    if(fp1==NULL)
        exit(1);
    fscanf(fp1,"%d\n",&word_num);
    for(i=0;i<27;i++)
        tree[0].next[i]=0;
    cur_num = 0;
    while(fgets(s,BUFF_LEN,fp1) != NULL)
    {
        //printf("%s %d\n",str,strlen(str));
        for(i=0;i < BUFF_LEN;i++)
            if(s[i] >= 'A' && s[i] <= 'Z')
                s[i] = s[i]+32;
        for(i=0;i < BUFF_LEN;i++)
            if(s[i] == '\n'){
                s[i] = '\0';
                break;
            }
        //printf("tag1\n");
        s[BUFF_LEN-1] = '\n';
        for(sl=0;sl<strlen(s);sl++)
            if(s[sl]=='/' || s[sl] == '?'){
                s[sl] = '\0';
                break;
            }
        if(strlen(s)==0)
            continue;
        s[sl]='\0';
        //printf("tag2\n");
        //printf("%s %d\n",str,strlen(str));
        insert(s);
        printf("%d : %s %d\n",cur_num++,s,strlen(s));
    }
    fclose(fp1);
    printf("occur times of d: %d\n",find(d));
    return 0;
}
void insert(char *s)
{
    int t,i,rt=root;
    //printf("%s\n",s);
    while(*s)
    {
       // printf("%c\n",*s);
        t=(int)(*s-'a');
        if(tree[rt].next[t]==0)
        {
            num++;
            for(i=0;i<27;i++)
                tree[num].next[i]=0;
            tree[rt].next[t]=num;
        }
        rt=tree[rt].next[t];
        tree[rt].cnt++;
        s++;
    }
    tree[rt].id=++cid;
}
int find(char *s)
{
    int t,rt=root;
    while(*s)
    {
        t=*s-'a';
        rt=tree[rt].next[t];
        if(rt==0)return 0;
        s++;
    }
    return tree[rt].cnt;
}