在线时间 24 小时 最后登录 2017-1-13 注册时间 2013-9-8 听众数 7 收听数 0 能力 0 分 体力 266 点 威望 0 点 阅读权限 30 积分 102 相册 0 日志 0 记录 0 帖子 43 主题 2 精华 0 分享 0 好友 5
升级 1%
TA的每日心情 无聊 2017-1-13 09:17
签到天数: 29 天
[LV.4]偶尔看看III
自我介绍 将来想用MATLAB做东西
群组 : 国赛讨论
本帖最后由 木头风火轮 于 2014-7-14 19:20 编辑
前不久玩《机械迷城2-小小星球大碰撞》玩到倒数第二关的这个拼图这里一时半会没拼出来, 就想到是不是可以用matlab矩阵实验室来求解答案
把每一个小块编号:a,b....k
然后进行数字化处理, 后面用这些数字矩阵在软件里来做拼图游戏,应该会简单很多,,下面是程序部分, clear all;
%假设初始状态,十个小块都在大面板的左上角放置
a='4040e0000000';
b='40e040000000';
c='80c060000000';
d='c08080000000';
e='c07000000000';
f='f04000000000';
g='20e000000000';
h='808080808000';
i='40e020000000';
j='c04040000000';
k='800000000000';
%十个小块在大面板中的十六进制编码
tab={a b c d e f g h i j k};
tab2=cell(1,11);
%定义一个一行十列的数组用以储存转换后的二进制编码
tabL=zeros(1,11);
for t=1:11
tx=tab(t);
%依次读取十六进制编码
tt=hex2dec(tx);
tab2{1,t}=dec2bin(tt);
%依次转换成二进制编码储存在tab2{}中
end
for k=1:11
n=tab2{1,k};
nn=num2str(n);
lin=length(nn);
%读取二进制编码并转换成字符串格式,以便能测量长度
%因为在从十进制转成二进制的过程中, 二进制数开头的0会被省略掉,所以需要重新测量长度
for m=lin:-1:1
if nn(m)==1
tabL(1,k)=47-m;
%这里应该是能表示出每个小块能向右移动的最大距离,
end
continue
end
end
复制代码 如上面最后一条注释所说, tabL(1,k)=47-m; 应该能储存每个小块的矩阵编码含1部分能向右移动的最大距离,但是在这个方式里面好像有点问题,另一个方式里面能表示出最大距离,和这个差不多, 那个程序问题比较多,,就不发另一个的了,
做到这一步之后, 最后就只差一个类似线性规划的多元一次方程了,
大概是
A U B U C U D U . . U J U K==ones(1,48),
是一个矩阵做并,或者也可能是做异或, 由于一开始就把所有条件都设为一维矩阵,所以最后并下来的结果和ones(1,48)相等,就能找出每个小块在大面板中从左上角开始移动的距离,从而得出正确的拼图答案
难就难在只有一个方程, 我matlab了解得不深, 不知道matlab该怎么去实现最后这一步,,接下几天在其他事情上会比较忙, 所以不再独自一个人研究, 发出来大家共同探讨,集思广益,
【后面有一个小小的建议,建议在YY频道里开设课程试听环节,159214作为数学中国旗下的指定的学员交流和授课频道, 没有了免费试听环节之后, YY里每天都没什么人, 没人气,除了交了费了来听课之外, 都很少有爱好者来围观了, ,对数学中国和YY电台都是不怎么好的事情】
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册地址
zan