计算24点

游戏规则:一副牌中抽去大小王剩下52张,任意抽取4张牌,利用四则运算(加减乘除以及括号)把牌面上的数算成24。每张牌能且只能用一次。

clear ;

v = [10 10 4 4] ; % 只有一个解

v = [2 4 8 10] ; % 有 44 个解

v = [1 4 7 13] ; % 有 49 个解

v = [1 6 7 11] ; % 有 50 个解

v = [1 5 7 12] ; % 有 54 个解

v = [3 3 8 8] ; % 比较难解的一组

v = ceil(13*rand(1,4)) ;

% 随机产生1-13也就是纸牌

fprintf('Input vector is:\n') ; disp(v) ;

vp = perms(v) ;

% 全排列

vp = unique(vp,'rows') ;

% 按行排除重复

[w,x,y,z] = ndgrid(1:4) ;

w = w(:) ;

x = x(:) ;

y = y(:) ;

z = z(:) ;

opi = [z y x w] ;

% 四个数字在不同位置

oper = '+-*/' ;

ops = oper(opi) ;

% 运算符在不同位置

%%

clear ab txt1 txt2

des = 24 ;

nops = size(ops,1) ;

nvp = size(vp,1) ;

paren = {

% 几种加括号的情况

'%d%s%d%s%d%s%d' % 12+6+3+3=24

'%d%s(%d%s%d%s%d)' % 8/(3-8/3)=24

'(%d%s%d)%s%d%s%d' % (13-11)*6+12=24

'(%d%s%d%s%d)%s%d' % (10+10-4)/4=24

'(%d%s%d)%s(%d%s%d)' % (7+9)/(2/3)=24

} ;

i = 0 ;

% 计数

for ops_i = 1:nops

for vp_i = 1:nvp

for paren_i = 1:length(paren)

% 所有排列位置所有运算符

txt1 = sprintf(paren{paren_i},...

vp(vp_i,1),ops(ops_i,1),...

vp(vp_i,2),ops(ops_i,2),...

vp(vp_i,3),ops(ops_i,3),...

vp(vp_i,4)) ;

num = round(eval(txt1)*1e6)/1e6 ;

if num==des

i = i + 1 ;

txt2{i,1} = txt1 ;

end

end

end

end

%%

if i==0

fprintf('无解!\n') ;

else

txt2 = unique(txt2) ;

i = length(txt2) ;

for i1 = 1:i

s = [txt2{i1} '=' sprintf('%d',des)] ;

disp(s) ;

end

fprintf('解的个数: %d\n',i) ;

end