前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >计算24点

计算24点

作者头像
万木逢春
发布2019-04-30 18:05:04
3620
发布2019-04-30 18:05:04
举报
文章被收录于专栏:帮你学MatLab帮你学MatLab

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-03-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 帮你学MatLab 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档