数据结构大作业——在一个字符矩阵中找到某个单词是否出现过

#include 
#define change_read() freopen("C:\\Users\\Administrator\\Desktop\\in.txt","r",stdin)
using namespace std;
struct p
{
    const static int maxm = 1e3+10;
    char mat[maxm][maxm];///store the matrix
};
int changex[8]= {0,0,1,-1,1,1,-1,-1}; ///the direction of the x-axis change
int changey[8]= {1,-1,0,0,1,-1,1,-1}; ///the direction of the y-axis change
const static int maxm = 1e5+10;///the max number of the nodes
int son[maxm][26];///dictionary tree
int num[maxm];///which word in this index
int num_words;///the number of the words
bool app[maxm];///decide the word appear or not
string words[maxm];
p que;///the matrix
int mat_len;///the length of the matrix
int cnt = 0;///the number of the node of the dictionary tree
void add(string que,int len,int ind) ///add the words to the dictionary tree
{
    int now = 0;///the index of now
    for(int i = 0; iif(son[now][que[i]-'a']==0)
        {
            son[now][que[i]-'a'] = ++cnt;
        }
        now = son[now][que[i]-'a'];
    }
    num[now] = ind;
}
void init() ///initialize the input
{
    cin>>mat_len;///read the length of the map
    for(int i = 0; i>que.mat[i];///read the map
    }
    cin>>num_words;///read the length of words
    for(int i = 1; i<=num_words; i++) ///read the words
    {
        cin>>words[i];
        add(words[i],words[i].length(),i);
    }
}
void dfs(int x,int y,int dir,int now = 0) ///dfs a word
{
    if(num[now])
    {
        app[num[now]] = true;
    }
    if(son[now][que.mat[x][y]-'a'])
    {
        dfs(x+changex[dir],y+changey[dir],dir,son[now][que.mat[x][y]-'a']);
    }
}
void ans()
{
    for(int i = 0; ifor(int j = 0; j///enumerate a start point
            for(int k = 0; k<8; k++)
            {
                ///enumerate a direction
                dfs(i,j,k);
            }
        }
    }
    ///output the words which appear in the mat
    for(int i = 1; i<=num_words; i++)
    {
        if(app[i]) cout<int main()
{
    change_read();
    init();
    ans();
    return 0;
}

运行结果

数据结构大作业——在一个字符矩阵中找到某个单词是否出现过_第1张图片

顺便贴上我巨丑无比的数据生成器

#include 
#define change_read() freopen("C:\\Users\\Administrator\\Desktop\\in.txt","r",stdin)
#define change_write() freopen("C:\\Users\\Administrator\\Desktop\\out.txt","w",stdout)
#define creat_read() freopen("C:\\Users\\Administrator\\Desktop\\in.txt","w",stdout)
using namespace std;
char mat[1005][1005];
int len;
bool in_map(int x,int y){
    if(x<0||x>=len) return false;
    if(y<0||y>=len) return false;
    return true;
}
int main()
{
    creat_read();
    srand(time(0));
    len = rand()%100;
    cout<for(int i = 0;ifor(int j = 0;jrand()%26+'a';
            cout<int num_words=rand()%1000;
    cout<int changex[8] = {0,0,1,-1,1,1,-1,-1};
    int changey[8] = {1,-1,0,0,1,-1,1,-1};
    while(num_words--){
        int i = rand()%len;
        int j = rand()%len;
        int dir = rand()%8;
        int xxx = rand()%(len>>1)+1;
        for(int x = 0;xif(in_map(i,j)){
                cout<else{
                cout<rand()%26+'a');
            }
            i+=changex[dir];
            j+=changey[dir];
        }
        cout<return 0;
}

你可能感兴趣的:(live)