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 |
Re:再贴个本蒟蒻的pascal的94ms代码~In Reply To:提供小弟的110MS的DFS源码和官方测试数据 Posted by:donkeyinacm at 2010-02-12 10:50:24 > //官方测试数据:http://www.informatik.uni-ulm.de/acm/Regionals/1998/ type stack=array[1..7]of longint; const com:array[1..5]of string[3]=('ADD','DIV','DUP','MUL','SUB'); var a,b,f:array[0..10]of longint; s:stack; test,n,m,i,p,ID:longint; function cal(x,y,z:longint):longint; begin case z of 1:cal:=x+y; 2:cal:=y div x; 4:cal:=x*y; 5:cal:=y-x; end; end; function command(var s:stack; var p:longint; i:longint):boolean; var next:longint; begin if i<>3 then begin next:=cal(s[p],s[p-1],i); if abs(next)>30000 then exit(false); dec(p); s[p]:=next; end else begin inc(p); s[p]:=s[p-1]; end; exit(true); end; function judge:boolean; var i,j,p:longint; s:stack; begin for i:=1 to n do begin fillchar(s,sizeof(s),0); p:=1; s[1]:=a[i]; for j:=1 to f[0] do begin if (f[j]=2)and(s[p]=0) then exit(false); if not command(s,p,f[j]) then exit(false); end; if s[p]<>b[i] then exit(false); end; exit(true); end; function dfs(deep:integer):boolean; var i,re:longint; res:stack; begin if (p=1)and(s[p]=b[m])and judge then exit(true); if (deep=ID)or(p>ID+1-deep) then exit(false); for i:=1 to 5 do begin if ((i<>3)and(p=1))or((i=2)and(s[p]=0)) then continue; re:=p; res:=s; if not command(s,p,i) then continue; inc(f[0]); f[f[0]]:=i; if dfs(deep+1) then exit(true); dec(f[0]); p:=re; s:=res; end; exit(false); end; begin randomize; repeat inc(test); read(n); if n=0 then exit; m:=random(n)+1; for i:=1 to n do read(a[i]); for i:=1 to n do read(b[i]); writeln('Program ',test); for ID:=0 to 10 do begin fillchar(f,sizeof(f),0); fillchar(s,sizeof(s),0); p:=1; s[1]:=a[m]; if dfs(0) then begin if f[0]=0 then writeln('Empty sequence') else begin for i:=1 to f[0]-1 do write(com[f[i]],' '); writeln(com[f[f[0]]]); end; break; end; if ID=10 then writeln('Impossible'); end; writeln; until false; end. Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator