matlab 画图被覆盖,利用Matlab的数组运算解决残缺棋盘覆盖问题

利用Matlab的数组运算解决残缺棋盘覆盖问题

姓名:易华龙

学号:200431020149

年级:2004级

班级:测绘工程一班

摘要:利用Matlab的数组运算解决覆盖问题

关键词:残缺棋盘, 覆盖, 队列, 动态数组,Matlab

1 概述

问题是用三格板覆盖缺了一格的残缺棋盘,不能覆盖缺少的一格.棋盘的长宽为2的k次方.

本程序是队列运用的典型实例.采用广度优先法探索剩余子棋盘,其中用队列来保存入口,并用Matlab中的动态数组实现队列.

原本打算用Matlab中的递归函数来解决此问题(递归算法属于深度优先探索),无奈后来发现Matlab中的函数难以引入全局变量,也不知道运用引用参数,所以后来决定采用非递归算法来解决此问题.可读性差了些.为了清晰起见,源程序中同时给出递归与非递归方法.

2 实例计算

2.1 数据说明

本实例中残缺棋盘的行列为16,16.

2.2 Matlab计算源程序

见最后.

2.3 图形显示结果

54225a7d93951641c9448a3ef86ee753.png

3 结论 与讨论

用Matlab计算方便,数组功能非常强大,尤其是数组的动态特性,结果可靠,永远不用担心溢出,图形显示极其容易.且在此次的作业中我发现了Matlab曾经速效慢的问题.如果在脚本运行过程中要在命令窗口中输出局部变量的值,则由于延迟,速度自然会减慢,所以在不需要时应用分号避免输出局部变量.

Matlab源程序:

1.非递归方法:

%(tr,tc,dr,dc,size)..............parameter

k=4;

dr0=9;

dc0=5;

size0=2^k;

tr=1;

tc=1;

dr=dr0;

dc=dc0;

size=size0;

Board=zeros(size,size);

tile=0;

ptr=1;

ptc=2;

pdr=3;

pdc=4;

psize=5;

front=1;

rear=1;

queue(rear,:)=[tr tc dr dc size ];

while front<=rear

tr=queue(front,ptr);

tc=queue(front,ptc);

dr=queue(front,pdr);

dc=queue(front,pdc);

size=queue(front,psize);

front=front+1;

tile=tile+1;    %所使用的三格板的数目;

t=tile;

s=size/2;       %象限大小;

%覆盖左上象限;

if(dr

if s>1

rear=rear+1;

queue(rear,:)=[tr tc dr dc s ];

end

else

Board(tr+s-1,tc+s-1)=t;

if s>1

rear=rear+1;

queue(rear,:)=[tr tc tr+s-1 tc+s-1 s ];

end

end

%覆盖右上象限;

if(dr

=tc+s)

if s>1

rear=rear+1;

queue(rear,:)=[tr tc+s dr dc s ];

end

else

Board(tr+s-1,tc+s)=t;

if s>1

rear=rear+1;

queue(rear,:)=[tr tc+s tr+s-1 tc+s s ];

end

end

%覆盖左下象限;

if(dr>=tr+s && dc

if s>1

rear=rear+1;

queue(rear,:)=[tr+s tc dr dc s ];

end

else

Board(tr+s,tc+s-1)=t;

if s>1

rear=rear+1;

queue(rear,:)=[tr+s tc tr+s tc+s-1 s ];

end

end

%覆盖右下象限;

if(dr>=tr+s && dc>=tc+s )

if s>1

rear=rear+1;

queue(rear,:)=[tr+s tc+s dr dc s ];

end

else

Board(tr+s,tc+s)=t;

if s>1

rear=rear+1;

queue(rear,:)=[tr+s tc+s tr+s tc+s s ];

end

end

end

%绘图

for i=1:tile+1

color(i,:)=[rand,rand,rand];

end

Board(dr0,dc0)=i;

for i=1:size0

for j=1:size0

x=[i,i+1,i+1,i];

y=[j,j,j+1,j+1];

color_t=color(Board(i,j),:);

fill(x,y,color_t);

hold on;

end

end

i=dr0;

j=dc0;

x=[i,i+1,i+1,i];

y=[j,j,j+1,j+1];

fill(x,y,'w');

hold on;

t=[i,i+1];

f=[j,j+1];

plot(t,f);

f=[j+1,j];

plot(t,f);

2.递归方法:

Board(1,1)=0;%全局变量

tile=1;      %全局变量

function TileBoard(tr,tc,dr,dc,size)

{

if ( size==1 )

return;

end

t=tile;

tile=tile+1;    %所使用的三格板的数目;

s=size/2;       %象限大小;

%覆盖左上象限;

if(dr

TileBoard(tr,tc,dr,dc,s);

else

Board(tr+s-1,tc+s-1)=t;

TileBoard(tr,tc,tr+s-1,tc+s-1,s);

end

%覆盖右上象限;

if(dr

=tc+s)

TileBoard(tr,tc+s,dr,dc,s);

else

Board(tr+s-1,tc+s)=t;

TileBoard(tr,tc+s,tr+s-1,tc+s,s);

end

%覆盖左下象限;

if(dr>=tr+s && dc

TileBoard(tr+s,tc,dr,dc,s);

else

Board(tr+s,tc+s-1)=t;

TileBoard(tr+s,tc,tr+s,tc+s-1,s);

end

%覆盖右下象限;

if(dr>=tr+s && dc>=tc+s)

TileBoard(tr+s,tc+s,dr,dc,s);

else

Board(tr+s,tc+s)=t;

TileBoard(tr+s,tc+s,tr+s,tc+s,s);

end

}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值