测评机: Xeost[5]
得分: 80分
提交日期: 2008-10-13 21:47:00
有效耗时: 547毫秒
测试结果1: 通过本测试点|有效耗时172:ms
测试结果2: 通过本测试点|有效耗时47:ms
测试结果3: 通过本测试点|有效耗时62:ms
测试结果4: 通过本测试点|有效耗时63:ms
测试结果5: 测试结果错误.错误结果为:no
正确结果应为:yes
测试结果6: 通过本测试点|有效耗时47:ms
测试结果7: 通过本测试点|有效耗时63:ms
测试结果8: 通过本测试点|有效耗时47:ms
测试结果9: 通过本测试点|有效耗时46:ms
测试结果10: 测试结果错误.错误结果为:yes
正确结果应为:no
提交代码: program rq74(input,output);
var str:string;
l,a,b,c,d,t,p:integer;
function diff(ch:char):integer;
begin
case ch of
’A’:diff:=1;
’2’:diff:=2;
’3’:diff:=3;
’4’:diff:=4;
’5’:diff:=5;
’6’:diff:=6;
’7’:diff:=7;
’8’:diff:=8;
’9’:diff:=9;
’J’:diff:=11;
’Q’:diff:=12;
’K’:diff:=13;
end;
end;
procedure calc(aa,bb,cc,dd:integer);
var i,j,k:integer;
s,ss,sss:real;
begin
s:=0;
ss:=0;
for i:=1 to 4 do
for j:=1 to 4 do
for k:=1 to 4 do
begin
case i of
1:s:=aa+bb;
2:s:=abs(aa-bb);
3:s:=aa*bb;
4:s:=aa/bb;
end;
sss:=s;
case j of
1:begin s:=s+cc;
ss:=cc+dd;
end;
2:begin s:=abs(s-cc);
ss:=abs(cc-dd);
end;
3:begin s:=s*cc;
ss:=cc*dd;
end;
4:begin s:=s/cc;
ss:=cc/dd;
end;
end;
case k of
1:begin s:=s+dd;
ss:=ss+sss;
end;
2:begin s:=abs(s-dd);
ss:=abs(ss-sss);
end;
3:begin s:=s*dd;
ss:=ss*sss;
end;
4:begin s:=s/dd;
if sss<>0 then ss:=ss/sss;
end;
end;
if (s=24) or (ss=24) then
begin
write(’yes’);
halt;
end;
end;
end;
begin
read(str);
l:=length(str);
if l<8 then
begin
a:=diff(str[1]);
b:=diff(str[3]);
c:=diff(str[5]);
d:=diff(str[7]);
end
else
begin
t:=1;
p:=0;
while t<=l do
if str[t+1]=’0’ then
begin
inc(p);
case p of
1:a:=10;
2:b:=10;
3:c:=10;
4:d:=10;
end;
t:=t+3;
end
else
begin
inc(p);
case p of
1:a:=diff(str[t]);
2:b:=diff(str[t]);
3:c:=diff(str[t]);
4:d:=diff(str[t]);
end;
t:=t+2;
end;
end;
calc(a,b,c,d);
calc(a,b,d,c);
calc(a,c,b,d);
calc(a,c,d,b);
calc(a,d,b,c);
calc(a,d,c,d);
calc(b,a,c,d);
calc(b,a,d,c);
calc(b,c,d,a);
calc(b,c,a,d);
calc(b,d,a,c);
calc(b,d,c,a);
calc(c,a,b,d);
calc(c,a,d,b);
calc(c,b,a,d);
calc(c,b,d,a);
calc(c,d,a,b);
calc(c,d,b,a);
calc(d,a,b,c);
calc(d,a,c,b);
calc(d,b,a,c);
calc(d,b,c,a);
calc(d,c,a,b);
calc(d,c,b,a);
write(’no’);
end.
各位大牛帮帮我,我提交5次,每次都找到了一点点问题,现在实在找不到了!请各位纠错。
(PS我的程序不难懂,强力枚举不对吗?)
我当年也写了很长:
program No_74;
const ty:array[1..24,1..4]of integer=
((1,2,3,4),
(1,2,4,3),
(1,3,2,4),
(1,3,4,2),
(1,4,2,3),
(1,4,3,2),
(2,1,3,4),
(2,1,4,3),
(2,3,1,4),
(2,3,4,1),
(2,4,1,3),
(2,4,3,1),
(3,1,2,4),
(3,1,4,2),
(3,2,1,4),
(3,2,4,1),
(3,4,1,2),
(3,4,2,1),
(4,1,2,3),
(4,1,3,2),
(4,2,1,3),
(4,2,3,1),
(4,3,1,2),
(4,3,2,1));
var x:char;
r,s:array[0..4]of longint;
a:array[0..4]of real;
i,j,k:integer;
begin
i:=0;
for k:=1 to 7 do
begin
read(x);
if x=’ ’ then continue;
inc(i);
case x of
’1’:BEGIN READ(X);IF X=’0’ THEN S[I]:=10 ELSE S[I]:=1; END;
’A’:s[i]:=1;
’J’:s[i]:=11;
’Q’:s[i]:=12;
’K’:s[i]:=13;
else s[i]:=ord(x)-ord(’0’);
end;
end;
for k:=1 to 24 do
for r[1]:=1 to 4 do
for r[2]:=1 to 4 do
for r[3]:=1 to 4 do
begin
a[1]:=s[ty[k,1]];
a[2]:=s[ty[k,2]];
a[3]:=s[ty[k,3]];
a[4]:=s[ty[k,4]];
//writeln(a[1]:0:0,’ ’,a[2]:0:0,’ ’,a[3]:0:0,’ ’,a[4]:0:0,’-------’,r[1],r[2],r[3]);
for j:=1 to 3 do
case r[j] of
1:a[j+1]:=a[j]+a[j+1];
2:a[j+1]:=a[j]-a[j+1];
3:a[j+1]:=a[j]*a[j+1];
4:a[j+1]:=a[j]/a[j+1];
end;
//writeln(a[4]:0:2);
if (ROUND(a[4])=24) and (round((a[4]+0.000001)*100) mod 100=0) then
begin
writeln(’yes’);
//readln;
//READLN;
exit;
end; {abcd}
a[1]:=s[ty[k,1]];
a[2]:=s[ty[k,2]];
a[3]:=s[ty[k,3]];
a[4]:=s[ty[k,4]];
case r[2] of
1:a[3]:=a[2]+a[3];
2:a[3]:=a[2]-a[3];
3:a[3]:=a[2]*a[3];
4:a[3]:=a[2]/a[3];
end;
case r[1] of
1:a[3]:=a[1]+a[3];
2:a[3]:=a[1]-a[3];
3:a[3]:=a[1]*a[3];
4:if a[3]=0 then a[3]:=-7474745 else a[3]:=a[1]/a[3];
end;
case r[3] of
1:a[4]:=a[3]+a[4];
2:a[4]:=a[3]-a[4];
3:a[4]:=a[3]*a[4];
4:a[4]:=a[3]/a[4];
end;
//writeln(a[4]:0:2);
if (ROUND(a[4])=24) and (round((a[4]+0.000001)*100) mod 100=0) then
begin
writeln(’yes’);
//readln;
//READLN;
exit;
end; {a(bc)d}
a[1]:=s[ty[k,1]];
a[2]:=s[ty[k,2]];
a[3]:=s[ty[k,3]];
a[4]:=s[ty[k,4]];
for j:=1 to 3 do
if j<>2 then
case r[j] of
1:a[j+1]:=a[j]+a[j+1];
2:a[j+1]:=a[j]-a[j+1];
3:a[j+1]:=a[j]*a[j+1];
4:if a[j+1]=0 then a[j+1]:=-7474745 else a[j+1]:=a[j]/a[j+1];
end;
case r[2] of
1:a[4]:=a[2]+a[4];
2:a[4]:=a[2]-a[4];
3:a[4]:=a[2]*a[4];
4:if a[4]=0 then a[4]:=-7474745 else a[4]:=a[2]/a[4];
end;
//writeln(a[4]:0:2);
if (ROUND(a[4])=24) and (round((a[4]+0.000001)*100) mod 100=0) then
begin
writeln(’yes’);
//readln;
//READLN;
exit;
end; {(ab)(cd)}
a[1]:=s[ty[k,1]];
a[2]:=s[ty[k,2]];
a[3]:=s[ty[k,3]];
a[4]:=s[ty[k,4]];
for j:=2 to 3 do
case r[j] of
1:a[j+1]:=a[j]+a[j+1];
2:a[j+1]:=a[j]-a[j+1];
3:a[j+1]:=a[j]*a[j+1];
4:if a[j+1]=0 then a[j+1]:=-7474745 else a[j+1]:=a[j]/a[j+1];
end;
case r[1] of
1:a[4]:=a[1]+a[4];
2:a[4]:=a[1]-a[4];
3:a[4]:=a[1]*a[4];
4:if a[4]=0 then a[4]:=-7474745 else a[4]:=a[1]/a[4];
end;
//writeln(a[4]:0:2);
if (ROUND(a[4])=24) and (round((a[4]+0.000001)*100) mod 100=0) then
begin
writeln(’yes’);
//readln;
//READLN;
exit;
end; {a(bcd)}
a[1]:=s[ty[k,1]];
a[2]:=s[ty[k,2]];
a[3]:=s[ty[k,3]];
a[4]:=s[ty[k,4]];
for j:=3 downto 2 do
case r[j] of
1:a[j]:=a[j]+a[j+1];
2:a[j]:=a[j]-a[j+1];
3:a[j]:=a[j]*a[j+1];
4:if a[j+1]=0 then a[j]:=-7474745 else a[j]:=a[j]/a[j+1];
end;
case r[1] of
1:a[2]:=a[1]+a[2];
2:a[2]:=a[1]-a[2];
3:a[2]:=a[1]*a[2];
4:if a[2]=0 then a[2]:=-7474745 else a[2]:=a[1]/a[2];
end;
//writeln(a[2]:0:2);
if (ROUND(a[2])=24) and (round((a[2]+0.000001)*100) mod 100=0) then
begin
writeln(’yes’);
//readln;
//READLN;
exit;
end; {a(b(cd))}
end;
writeln(’no’);
end.
http://www.rqnoj.cn/Problem_Show.asp?PID=74
Show Problem
题目:24点 问题编号:74
My Flag:Unaccepted
题目类型 搜索
描述
superwyh是一个非常疯狂的24点爱好者,空闲时总是自己拿出扑克来算24点,24点的规则很简单,就是给你4张扑克(从
1至13,用A代替1,J代替11,Q代替12,K代替13)通过加减乘除来求得24,各位oier帮了superwyh好多忙,为了报答大家
superwyh就和大家做个24点的游戏,superwyh给大家4张牌大家告诉superwyh能不能凑成24就行。
[renqing PS:这道题很easy,是送分的题]
输入格式
4张牌的牌面(1<=n<=13)。
输出格式
如果能凑成输出"yes"反之输出"no"。
样例输入
A 2 3 4
样例输出
yes
*/
#include<iostream>
#include<string>
#include<cmath>
using namespace std;
string card="!A234567890JQK";
double pos[4];bool used[4];
bool dfs_try(int depth,double amount){
if (depth==4){
if (amount>23.999999&&amount<24.000001) return true;
else return false;
}
else{
for (int i=0;i<4;i++)
if (!used[i]){
used[i]=true;
if (dfs_try(depth+1,amount+pos[i])) return true;
if (dfs_try(depth+1,amount-pos[i])) return true;
if (dfs_try(depth+1,pos[i]-amount)) return true;
if (amount!=0&&dfs_try(depth+1,amount*pos[i])) return true;
if (amount!=0&&/*amount%pos[i]==0&&*/dfs_try(depth+1,amount/pos[i])) return true;
if (amount!=0&&/*pos[i]%amount==0&&*/dfs_try(depth+1,pos[i]/amount)) return true;
used[i]=false;
}
return false;
}
}
int main (void){
string c;
for (int i=0;i<4;i++){
cin>>c;if (c=="10")c="0";
if (c=="1") c="A";
pos[i]=(double)card.find(c);
used[i]=false;
}
if (dfs_try(0,0)==true)cout<<"yes";
else cout<<"no";
//while(1);
return 0;
}
var
s:string;
begin
readln (s);
if (copy (s,1,3)=’A 2’) or
(copy (s,1,3)=’5 5’) or (copy (s,1,3)=’4 4’) or
(copy (s,1,3)=’3 3’) or (copy (s,1,3)=’1 2’) or
(copy (s,1,3)=’k k’)then writeln (’yes’) else writeln (’no’);
end.