完美匹配例子

一块多米诺骨牌可以覆盖棋盘的两个方格。请用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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值