一块多米诺骨牌可以覆盖棋盘的两个方格。请用31块多米诺骨牌盖满一个除去左上和右下方格(在同一对角线上)的棋盘。(一个棋盘由8×8 = 64个方格组成)
n=8;
from=zeros(4*n*n,1,'int32');
to=from;
ind=0;
node=zeros(n,n);
node(:)=0:n*n-1;
for i=1:n
for j=1:n
if i==1
if j==1
elseif j==n
from(ind+1:ind+2)=node(i,j);
to(ind+1)=node(i,j-1);
to(ind+2)=node(i+1,j);
ind=ind+2;
else
from(ind+1:ind+3)=node(i,j);
to(ind+1)=node(i,j-1);
to(ind+2)=node(i+1,j);
to(ind+3)=node(i,j+1);
ind=ind+3;
end
elseif i==n
if j==1
from(ind+1:ind+2)=node(i,j);
to(ind+1)=node(i-1,j);
to(ind+2)=node(i,j+1);
ind=ind+2;
elseif j==n
else
from(ind+1:ind+3)=node(i,j);
to(ind+1)=node(i,j-1);
to(ind+2)=node(i-1,j);
to(ind+3)=node(i,j+1);
ind=ind+3;
end
else
if j==1
from(ind+1:ind+3)=node(i,j);
to(ind+1)=node(i-1,j);
to(ind+2)=node(i+1,j);
to(ind+3)=node(i,j+1);
ind=ind+3;
elseif j==n
from(ind+1:ind+3)=node(i,j);
to(ind+1)=node(i-1,j);
to(ind+2)=node(i+1,j);
to(ind+3)=node(i,j-1);
ind=ind+3;
else
from(ind+1:ind+4)=node(i,j);
to(ind+1)=node(i-1,j);
to(ind+2)=node(i+1,j);
to(ind+3)=node(i,j-1);
to(ind+4)=node(i,j+1);
ind=ind+4;
end
end
end
end
L=from==0 | from==n*n-1 | to==0 | to==n*n-1;
from(L)=[];
to(L)=[];
inds=find(from>to);
tmp=from(inds);
from(inds)=to(inds);
to(inds)=tmp;
from=double(from);
to=double(to);
A=sparse([from;to],[to;from],1);
[m,c]=matching(A);
if sum(m>0)/2==31
disp('存在用31块多米诺骨牌盖满该网格的方案')
else
disp('不存在用31块多米诺骨牌盖满该网格的方案')
end