游戏规则:一副牌中抽去大小王剩下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