我的思路是这样的:先在search1求出四张扑克的排列,
接着用search1所得的排列在search2枚举两两扑克之间的符号1代表+,2代表-,3代表*,4代表/,然后在每一种枚举情况再分五种情况讨论括号问题.
program rqnoj74;
var
i:integer;
s,s1:string;
p:array[1..4] of 1..13;
a:array[1..4] of 1..13;
f:set of 1..4;
flag:boolean;
procedure print;
begin
writeln(’yes’);
halt;
end;
function sum(a:real;i:integer;b:real):real;
begin
case i of
1:exit(a+b);
2:exit(a-b);
3:exit(a*b);
4:if b=0 then flag:=false
else exit(a/b);
end;
end;
procedure search2;
var i,j,k:integer;s:real;
begin
for i:=1 to 4 do
for j:=1 to 4 do
for k:=1 to 4 do
begin
flag:=true;
s:=sum(sum(sum(a[1],i,a[2]),j,a[3]),k,a[4]);
if (flag)and(s=24) then print;
flag:=true;
s:=sum(sum(a[1],i,a[2]),j,sum(a[3],k,a[4]));
if (flag)and(s=24) then print;
flag:=true;
s:=sum(sum(a[1],i,sum(a[2],j,a[3])),k,a[4]);
if (flag)and(s=24) then print;
flag:=true;
s:=sum(a[1],i,sum(sum(a[2],j,a[3]),k,a[4]));
if (flag)and(s=24) then print;
flag:=true;
s:=sum(a[1],i,sum(a[2],j,sum(a[3],k,a[4])));
if (flag)and(s=24) then print;
end;
end;
procedure search1(k:integer);
var i:integer;
begin
if k>5 then exit;
if k=5 then search2;
for i:=1 to 4 do
if not(i in f) then
begin
a[k]:=p[i];
f:=f+[i];
search1(k+1);
f:=f-[i];
end;
end;
begin
readln(s);
s:=s+’ ’;
for i:=1 to 4 do
begin
s1:=copy(s,1,pos(’ ’,s)-1);
delete(s,1,pos(’ ’,s));
case s1[1] of
’A’:p[i]:=1;
’J’:p[i]:=11;
’Q’:p[i]:=12;
’K’:p[i]:=13;
else val(s1,p[i]);
end;
end;
f:=[];
search1(1);
writeln(’no’);
end.