求大牛找错---pascal

program vijos1134;
var
a:array[1..4] of longint;
head,i,j,k,l,ans:longint;
p:string;
pan:boolean;
procedure dfs(s:real;a,b,c,d,e:longint);
begin
if (e<=0) then
begin if (s=24) then begin ans:=1; writeln(ans); halt; end; exit; end;
dfs(s+a,b,c,d,0,e-1);
dfs(s-a,b,c,d,0,e-1);
dfs(s*a,b,c,d,0,e-1);
dfs(s/a,b,c,d,0,e-1);
if (e>=2) then dfs(s*(a+b),c,d,0,0,e-2);
if (e>=2) then dfs(s*(a-b),c,d,0,0,e-2);
if (e>=2) then dfs(s/(a+b),c,d,0,0,e-2);
if (a-b<>0) then dfs(s/(a-b),c,d,0,0,e-2);
if (e=4) then dfs(s+a*b-c*d,0,0,0,0,e-4);
if (e=4) then dfs(s+a*b-c/d,0,0,0,0,e-4);
if (e=4) then dfs(s+a*b+c/d,0,0,0,0,e-4);
if (e=4) then dfs(s+a*b+c*d,0,0,0,0,e-4);
end;

begin
readln(p);
head:=0;
for i:=1 to length(p) do
case p[i] of
'A': begin inc(head); a[head]:=1; end;
'2','3','4','5','6','7','8','9': begin inc(head); a[head]:=ord(p[i])-ord('0'); end;
'1': begin inc(head); a[head]:=10; end;
'0',' ':continue;
'J': begin inc(head); a[head]:=11; end;
'Q': begin inc(head); a[head]:=12; end;
'K': begin inc(head); a[head]:=13; end;
end;
ans:=0;
for i:=1 to 4 do for j:=1 to 4 do for k:=1 to 4 do for l:=1 to 4 do
if (i<>j) and (j<>k) and (k<>l) and (i<>k) and (i<>l) and (j<>l) then
dfs(0,a[i],a[j],a[k],a[l],4);
writeln(ans);
end.

4 条评论

  • @ 2015-10-13 06:35:31

    感谢楼下

  • @ 2015-10-07 11:38:28

    咳咳发现乘号漏了,再补一次

    你这里应该是想的不够全面吧
    先序运算表达式是 abcdOOO abcd是数字,OOO是符号
    根据排列组合 a有4种,b有三种,c有两种,d有一种可能
    符号 考虑/和- 的先后问题有6种可能
    总共4x3x2x1x6x6x6=5184’种可能
    实际上在 43里面 已经包含了先后顺序
    所以 4x3x2x1x4x6x6=3456种可能
    我看你是递归查找?
    例题都说明了 后面的c和d有可能成为‘ b/(c+d),b/(c-d)’,……
    你这个通过改数字位置是不能实现的,你这个只能‘(c+d)/b’
    你这些似乎没考虑

  • @ 2015-10-07 11:35:01

    你这里应该是想的不够全面吧
    先序运算表达式是 abcdOOO abcd是数字,OOO是符号
    根据排列组合 a有4种,b有三种,c有两种,d有一种可能
    符号 考虑/和- 的先后问题有6种可能
    总共‘4*3*2*1*6*6*6=5184’ 种可能
    实际上在 43里面 已经包含了先后顺序
    所以 ‘4*3*2*1*4*6*6=3456’种可能
    我看你是递归查找?
    例题都说明了 后面的c和d有可能成为‘ b/(c+d),b/(c-d)’,……
    你这个通过改数字位置是不能实现的,你这个只能‘(c+d)/b’
    你这些似乎没考虑

  • @ 2015-10-07 11:34:01

    你这里应该是想的不够全面吧
    先序运算表达式是 abcdOOO abcd是数字,OOO是符号
    根据排列组合 a有4种,b有三种,c有两种,d有一种可能
    符号 考虑/和- 的先后问题有6种可能
    总共4*3*2*1*6*6*6=5184 种可能
    实际上在 4*3里面 已经包含了先后顺序
    所以 4*3*2*1*4*6*6=3456种可能
    我看你是递归查找?

    例题都说明了 后面的c和d有可能成为 b/(c+d),b/(c-d),……
    你这个通过改数字位置是不能实现的,你这个只能(c+d)/b
    你这些似乎没考虑

  • 1

信息

ID
1134
难度
8
分类
搜索 点击显示
标签
(无)
递交数
9082
已通过
852
通过率
9%
被复制
7
上传者