讨论 / 第四个测试数据,并看下我哪错!!!
caiweiwenjs 2013-01-29 00:59:00
点我顶贴 收藏 删除
我的程序!可以在vijos AC.

我的思路是这样的:先在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.

#1 税子龙的MD@2009-02-09 21:19:00
回复 删除
3, 3, 8, 8的24点答案:

1: 8 ÷ (3 - 8 ÷ 3)

2: 8 ÷ (3 - (8 ÷ 3))

#2 caiweiwenjs@2009-02-16 02:42:00
回复 删除
谢谢你的数据!我知道哪里错了,是实数和整数比较出了问题.我把比较改成这样就过了abs(24-s)<0.0000001
#3 GCX@2013-01-29 00:59:00
回复 删除
回复 沙发税子龙的MD 的帖子

万分感谢!!!!

#4 NEW WORLD@2014-08-18 01:08:02
回复 删除
回复 #2 caiweiwenjs:全排列就不用考虑括号了。。。。吧
查看更多回复
提交回复