• 自动机的构造


    自动机的构造这个程序感觉有点难度,代码还在继续完善中。。

      1 #include<stdio.h>
      2 #define N 50
      3 char fx[N][N];        //映射
      4 int verticalqueue[N]; //竖线队列
      5 int front1,next1;     
      6 int starqueue[N];     //星号队列
      7 int front2,next2;
      8 int k;
      9 void judge(int i,char n[],char aph[]);      //把|、*和状态入队列
     10 main()
     11 {
     12     char n[N];                   //接收键盘输入
     13     int i=0;
     14     int j,o;
     15     char x;
     16     char aph[N];
     17     front1=next1=0;
     18     front2=next2=0;
     19     printf("请输入正规式(#号键结束):");
     20     do
     21     {
     22         
     23         scanf("%c",&x);
     24         if(x!='#')
     25         {
     26                 n[i]=x;
     27                 i++;
     28         }
     29     }while(x!='#');
     30     for(j=0;j<N;j++)  aph[j]='~';  
     31     judge(i,n,aph);
     32     for(o=0;o<=N;o++)
     33     for(j=0;j<=k;j++)
     34     {
     35         if(o==0)
     36         {    
     37             fx[0][j+1]=aph[j];
     38             printf("%c",fx[0][j+1]);
     39         }
     40         else fx[o][j]=0;          //初始化fx[][]数组
     41     }
     42     fx[1][0]='x';             //初状态
     43     fx[2][0]='y';             //终止状态
     44 
     45 }
     46 
     47 
     48  
     49 void judge(int i,char n[],char aph[])
     50 {
     51     int j,m;
     52     int x=0;
     53     k=0;
     54     for(j=0;j<i;j++)
     55     {
     56         if(n[j]=='|')
     57         {
     58             verticalqueue[next1]=j;
     59             next1++;
     60         }
     61         if(n[j]=='*')
     62         {
     63             starqueue[next2]=j;
     64             next2++;
     65         }
     66         if(n[j]>='a'&&n[j]<='z')
     67         {
     68             for(m=0;m<i;m++)
     69             {
     70                 if(aph[m]==n[j])  x=1;  //查找该状态是否已在数组里
     71             }
     72                 if(x==0)
     73             {    
     74                 aph[k]=n[j];         //把所有状态存入数组
     75                 k++;                 //k记录状态的个数
     76                     
     77             }
     78         }
     79     }
     80 }
     81 
     82 void fill(int i,char n[],char aph[])
     83 {
     84     int j;
     85     int p,q;      //记录竖线和星号所在的位置 
     86     int p1,q1;
     87     int p2,q2;
     88     int g=1;      //fx[][]的行
     89     int m=1;      //序号
     90     int n=3;
     91     p=q=0;
     92     p1=verticalqueue[front1];   
     93     q1=starqueue[front2]; 
     94     for(j=0;j<=i;j++)
     95     {
     96         p2=verticalqueue[front1];      //把第一个竖线所在的位置提取出来
     97         q2=starqueue[front2];          //把第一个星号所在的位置提取出来
     98 
     99         if(p2<q2)                       //竖线在前面
    100         {
    101             while((p<p1)&&(g<=k))         //竖线的前半部分
    102             {
    103                 if(n[p]==fx[0][g])
    104                 {
    105                     fx[g][p]=m;
    106                 }
    107                 p++;
    108                 g++;
    109             }
    110 
    111         }
    112 
    113         
    114         else if(p2>q2)        //竖线在后面
    115         {
    116             while((p<p1)&&(g<=k))         //竖线的前半部分
    117             {
    118                 if(n[p]==fx[0][g])
    119                 {
    120                     fx[g][p]=m;
    121                     fx[n][0]=m;
    122                 }
    123                 n++;
    124             //    p++;
    125             //    g++;
    126             }
    127             fx[g][p]
    128         }
    129         p1=verticalqueue[front1];   
    130         q1=starqueue[front2]; 
    131         front1++;
    132         front2++;
    133     }
    134 
    135 }
  • 相关阅读:
    最长什么什么子序列进阶(xym的hu测)
    樱花庄的宠物女孩AtCoder Grand Contest 015E
    樱花庄的宠物女孩AtCoder Grand Contest 015E
    boyne
    bzoj1001 [BeiJing2006]狼抓兔子
    95.自动注射
    94.文件bat脚本自删除
    93.下载器
    91.#pragma 详解
    91.生成ini文件并写入和读取ini文件
  • 原文地址:https://www.cnblogs.com/veol/p/6107689.html
Copyright © 2020-2023  润新知