Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
提供小弟的110MS的DFS源码和官方测试数据//官方测试数据:http://www.informatik.uni-ulm.de/acm/Regionals/1998/ #include <iostream> #define MAXV 30000 #define INF 999999 #define MAXN 11 #define MAXS 11 #define ADD 1 #define DIV 2 #define DUP 3 #define MUL 4 #define SUB 5 int S[MAXN][MAXS],atop[MAXN],y[MAXN]; int N,A[MAXN],CA[MAXN],minlen,mCount=1; void Print(int c) { switch(c) { case ADD: printf("ADD"); break; case SUB: printf("SUB"); break; case MUL: printf("MUL"); break; case DUP: printf("DUP"); break; case DIV: printf("DIV"); break; } } void dfs(int len) { int i,j,a[MAXN],b[MAXN]; if(len-1<minlen) { for(j=0;j<N;j++) if(S[j][0]!=y[j]||atop[j]!=0) break; if(j==N) { minlen=len-1; memcpy(A,CA,sizeof(A)); } } if(len>minlen||len>10) return; for(i=1;i<=5;i++) { int con=-1; bool LastOneChanged=false; for(j=0;j<N&&con==-1;j++) { if(i!=DUP) { if(atop[j]==0) { con=j; break; } if(i==DIV&&S[j][atop[j]]==0) { con=j; break; } b[j]=S[j][atop[j]--]; a[j]=S[j][atop[j]--]; switch(i) { case ADD: S[j][++atop[j]]=a[j]+b[j]; break; case DIV: S[j][++atop[j]]=a[j]/b[j]; break; case MUL: S[j][++atop[j]]=a[j]*b[j]; break; case SUB: S[j][++atop[j]]=a[j]-b[j]; break; } CA[len]=i; if(abs(S[j][atop[j]])>MAXV) { LastOneChanged=true; con=j; break; } }else{ atop[j]++; S[j][atop[j]]=S[j][atop[j]-1]; CA[len]=DUP; } } if(con==-1) dfs(len+1); if(i!=DUP) for(j=0;j<N&&(con==-1||((LastOneChanged==false&&j<con)||(LastOneChanged==true&&j<=con)));j++) { S[j][atop[j]]=a[j]; S[j][++atop[j]]=b[j]; } else for(j=0;j<N&&(con==-1||((LastOneChanged==false&&j<con)||(LastOneChanged==true&&j<=con)));j++) atop[j]--; } } int main() { freopen("c:/aaa.txt","r",stdin); int i; while(scanf("%d",&N)&&N) { for(i=0;i<N;i++) scanf("%d",&S[i][0]); for(i=0;i<N;i++) scanf("%d",&y[i]); memset(atop,0,sizeof(atop)); minlen=INF; dfs(1); printf("Program %d\n",mCount++); if(minlen==INF) printf("Impossible\n\n"); else if(minlen==0) printf("Empty sequence\n\n"); else { Print(A[1]); for(i=2;i<=minlen;i++) { printf(" "); Print(A[i]); } printf("\n\n"); } } return 0; } Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator