利用Matlab的数组运算解决残缺棋盘覆盖问题
姓名:易华龙
学号:200431020149
年级:2004级
班级:测绘工程一班
摘要:利用Matlab的数组运算解决覆盖问题
关键词:残缺棋盘, 覆盖, 队列, 动态数组,Matlab
1 概述
问题是用三格板覆盖缺了一格的残缺棋盘,不能覆盖缺少的一格.棋盘的长宽为2的k次方.
本程序是队列运用的典型实例.采用广度优先法探索剩余子棋盘,其中用队列来保存入口,并用Matlab中的动态数组实现队列.
原本打算用Matlab中的递归函数来解决此问题(递归算法属于深度优先探索),无奈后来发现Matlab中的函数难以引入全局变量,也不知道运用引用参数,所以后来决定采用非递归算法来解决此问题.可读性差了些.为了清晰起见,源程序中同时给出递归与非递归方法.
2 实例计算
2.1 数据说明
本实例中残缺棋盘的行列为16,16.
2.2 Matlab计算源程序
见最后.
2.3 图形显示结果
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
}