发 帖  
原厂入驻New
[资料]

转:用arrayfun求解八皇后问题

2011-8-16 14:37:36  1954
分享
用剔除的思想去求解八皇后问题
决定用arrayfun来重写一下这个问题,发现arrayfun的效率并不高
这样做只为代码的简洁,欢迎大家讨论






  1. clear;clc;close all
  2. tic
  3. N=8;
  4. T=N-2;
  5. rows=1:N;         % 皇后所在行的位置
  6. cols=perms(rows);  % 皇后所在列的位置
  7. S=size(cols,1);
  8. M=zeros(N,N,S); % 存储所以情况的矩阵
  9. linearInd = sub2ind(size(M), repmat(rows',1,S), cols', repmat(1:S,N,1));
  10. M(linearInd) = 1;
  11. dv=arrayfun(@(k)max([arrayfun(@(x)sum(diag(M(:,:,k),x)),-T:T),arrayfun(@(x)sum(diag(rot90(M(:,:,k)),x)),-T:T)]),1:S);
  12. M(:,:,dv>1)=[];
  13. toc

复制代码



皇后可以在横、竖、斜线上不限步数地吃掉其他棋子。如何将8个皇后放
在棋盘上(有8*8个方格),使它们谁也不能被吃掉!这就是著名的八皇后问题

下面使用matlab,采用剔除法解决八后问题:


clc;
clear;
% Author's email:zjliu2001@163.com
tic
f=perms(1:8);
d=8*(0:7);
d=meshgrid(d,1:size(f,1));
p=d+f;
M=zeros(8,8,size(f,1));
for k=1:size(f,1);
   Mm=zeros(8);
   Mm([p(k,1:end)])=1;
   a=0;
   for n=-6:6;
       a=max(a,sum(diag(Mm,n)));
   end
   Mr=rot90(Mm);
   for n=-6:6;
       a=max(a,sum(diag(Mr,n)));
   end
   dv(k)=a;
   M(:,:,k)=Mm;
end
M(:,:,dv>1)=[];
size(M)
gamma(8+1)
toc
这两种都ok了,自己看看参考


0

评论

高级模式
您需要登录后才可以回帖 登录 | 注册

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容图片侵权或者其他问题,请联系本站作侵删。 侵权投诉
发资料
关闭

站长推荐 上一条 /8 下一条

快速回复 返回顶部 返回列表