POJ 3332 Parsing Real Numbers

来源:互联网 发布:魔力宝贝连击奥义数据 编辑:程序博客网 时间:2024/06/05 23:54

http://poj.org/problem?id=3332

题意:给你一个real number , 要求判断是否合法。

思路:第一题DFA。所谓的DFA无非就是一种在各个有限的状态之间转化的图,经过一系列的变化之后问最后一种状态是否合法。

代码:

/*par=0: 初始状态1: 以 + 或者 - 号  2: 以 .结尾 3: 以数字结尾, 没出现过小数点 4: 以E 或者 e结尾 5: 数字后面跟blank 6: 有了E,以数字结尾 7: 有了E , 以+或者-结尾 8: 有了E ,数字后面跟blank 9: 以数字结尾, 已经出现过小数点 */#include<stdio.h>#include<string.h>#include<ctype.h>int T ,N,par;char ch[1010] ;char now[1010] ;void Init(){int i , j ,k, len;i = 0 ; len = strlen(ch);while(i<len && (ch[i ]==' ' || ch[i]==9))i++ ;j = len-1 ;while(j>=i &&  (ch[j]==' ' || ch[i]==9))j-- ;for(k=0 ;i<=j;i++,k++){now[k] = ch[i] ;}now[k] = 0 ;N = k ;}void judge(char c){if(par == 0){if(c=='+' || c=='-')par = 1 ;else if(c == '.')par = -1 ;else if( isdigit(c) ) par = 3 ;else if( c=='e' || c=='E') par = 4 ;elsepar = -1 ;}else if(par == 1){if( isdigit(c) )par = 3 ;else par = -1 ;}else if(par == 2){if( isdigit(c) )par = 9 ;else par = -1 ;}else if(par == 3){if( isdigit(c) ) par = 3 ;else if(c == '.')par = 2 ;else if(c=='+' || c=='-')par = -1 ;else if(c=='e' || c=='E')par = 4 ;else par = 5 ;//空格 }else if(par == 9){if( isdigit(c) )par = 9 ;else if(c=='e' || c=='E')par = 4 ;else if(c==' ' || c==9)par = 5 ;else par = -1 ;}else if(par == 4){if( isdigit(c) )  par = 6 ;else if(c=='+' || c=='-')par = 7 ;else par = -1 ;}else if(par == 5){if(c=='e' || c=='E') par = 4 ;else if(c==' ' || c==9)par = 5 ;elsepar = -1 ;}else if(par == 6){if(isdigit(c)) par = 6 ;else if(c==' ' || c==9)par = 8 ;else par = -1 ;}else if(par == 7) {if(isdigit(c))par = 6 ;else par = -1 ;}else if(par == 8){if(c==' ' || c==9)par = 8 ;elsepar = -1 ;}}void solve(){int i,j ;par = 0 ;bool ok = 1 ;for(i=0;i<N;i++){judge( now[i] );if(par == -1){ok = 0 ;break ;}}if(par==1 || par==2 || par==4 || par==7 || par==-1) ok=0 ;if(!ok)printf("ILLEGAL\n");else printf("LEGAL\n");}int main(){scanf("%d",&T) ;getchar() ;while(T--){gets(ch) ;Init() ;solve() ;}return 0 ;}