讨论 / 大牛帮忙,如何AC这个简单题
Wych 2010-10-21 19:47:00
点我顶贴 收藏 删除
状态: Unaccepted

测评机: 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我的程序不难懂,强力枚举不对吗?)

#1 winter122@2008-10-13 23:20:00
回复 删除
不用那么复杂,一个普通的递归不久好了?
#2 Wych@2008-10-14 05:07:00
回复 删除
额,我递归不好,所以用最土的方法做的,

但为什么不对呢?我的做法还有什么欠缺?请大牛指正。

#3 lizhixin@2008-10-15 06:58:00
回复 删除
我递归也不好

我当年也写了很长:

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.

#4 lizhixin@2008-10-15 07:04:00
回复 删除
可能你讨论的情况少了
#5 Wych@2008-10-16 07:14:00
回复 删除
额,我看晕了...

可我比较半天还是没想明白我怎么错的?麻烦大牛看一下。

#6 飞雪天涯@2008-11-12 07:52:00
回复 删除
/*

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;

}

#7 李山山@2008-11-12 07:53:00
回复 删除
program p74pp74;

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.

#8 飞雪天涯@2008-11-12 07:54:00
回复 删除
回LS:

真能诈!!!

#9 狼崖雪@2010-10-21 18:10:00
回复 删除
扑克里还有种牌叫10………………
#10 struggle@2010-10-21 19:47:00
回复 删除

楼上真是一语道破天机。。。

查看更多回复
提交回复