matlab sprintf_MATLAB 计算24点

dd17658d2fc58e8339489f0676ae0d26.png

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

9c39028ec32addf350c27e2ff43abd73.png 9d5e151b6c1cf0d894bb8464f373dec3.gif

关注公众号:MATLAB基于模型的设计 (ID:xaxymaker) ,每天推送MATLAB学习最常见的问题,每天进步一点点,业精于勤荒于嬉

ca02991ff47da49e7983031d91d28698.png

可保存后扫码关注哦!

e7d155f329455fdac4445d5218468b93.gif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值