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 ;
else par = -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 ;
else par = -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 ;
else par = -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 ;
}