2013年12月28日 星期六

UVA 112 - Tree Summing

[有限狀態自動機?]
原本寫了一個建樹的@@

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define NONE -1
enum TYPE
{
TYPE_NULL=-1,
TYPE_NUM,
TYPE_LEFTQ,
TYPE_RIGHTQ
};
class Token
{
public:
TYPE Type;
int val;
Token():Type(TYPE_NULL),val(0){};
void Set(char *I)
{
if(I[0]==')') Type=TYPE_RIGHTQ;
else if(I[0]=='(') Type=TYPE_LEFTQ;
else if(I[0]=='\0') Type=TYPE_NULL;
else
{
val=0;
Type=TYPE_NUM;
int sgn=1;
if(I[0]=='-') sgn=-1;
for(int lx=(sgn==-1);I[lx]!='\0';lx++)
val=val*10+(I[lx]-'0');
val*=sgn;
}
}
};

Token Line[10000];int Tokcnt=0,Tokptr=0;

void NextToken()
{
Tokptr++;
}
void AddToken(char *I)
{
if(I[0]=='\0') return ;
// printf("Add [%s]\n",I);
Line[Tokcnt].Set(I);
Tokcnt++;
}
bool judge;
bool Tree(int n,int k) // TREE自動機
{
// printf("%d\n",Line[Tokptr].Type);
NextToken();
if(Line[Tokptr].Type==TYPE_RIGHTQ)
{
NextToken();
return true;
}
else
{
int vv=Line[Tokptr].val;
NextToken();
bool bleft=Tree(n+vv,k);
bool bright=Tree(n+vv,k);
NextToken();
if((bleft&&bright))
judge=(judge||((n+vv)==k));
return false;
}
}
void ReadData()
{
Tokcnt=0;
Tokptr=0;
judge=false;
int flag=1;
char c=getchar();
while(c!='(')
c=getchar();
AddToken("(");
char TOK[100];
int TOKlen=0;
while(flag)
{
c=getchar();
if((c==' ')||(c=='\n')||(c=='\t'))
{
TOK[TOKlen]='\0';
AddToken(TOK);
TOKlen=0;
}
else if(c=='(')
{
TOK[TOKlen]='\0';
AddToken(TOK);
TOKlen=0;
AddToken("(");
flag++;
}
else if(c==')')
{
TOK[TOKlen]='\0';
AddToken(TOK);
TOKlen=0;
AddToken(")");
flag--;
}
else
TOK[TOKlen++]=c;
}
}
int main()
{
int k;
while(scanf("%d",&k)!=EOF)
{
ReadData();
Tree(0,k);
if(judge)
printf("yes\n");
else
printf("no\n");
}
return 0;
}

沒有留言:

張貼留言