史蒂夫与MATLAB图像处理

图像处理的概念、算法和MATLAB

八皇后问题——生成所有的解决方案金宝搏官方网站

4月20日,我写了一个算法求解八皇后问题。在这个问题上,任务是将八皇后皇后的棋盘上,这样就不会攻击其他女王。这是一个解决方案。

我那篇文章发表后,我开始好奇别人可能提交关于这个问题在文件交换。搜索一点给我这个提交uu tii。当我看着提交时,我很惊讶它含有多少代码。就是这样:

M = eightqueens()函数N = 8;T = 2;行= 1:N;关口=烫发(行);S =大小(关口,1);M = 0 (N, N, S);linearInd = sub2ind(大小(M), repmat(行,1,S),关口”,repmat (1: S、N 1));M (linearInd) = 1;dv = arrayfun (@ (k)马克斯([arrayfun (@ (x)和(诊断接头(M (:,:, k), x)), - T: T), arrayfun (@ (x)和(诊断接头(rot90 (M (:,:, k)), x)), - T: T)]), 1: S);米(:,:,dv > 1) = [];

当我跑它时,它返回一个8 x8x92数组。引起了我的注意,因为有大小92解决八皇后问题(包括旋转和翻转)。金宝搏官方网站

M = eightqueens;谁
类属性名称大小字节8 x8x92 47104双

让我们窥视的飞机之一

米(:,:45)
ans = 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0

的确,这是一个解决方案。所以,发生了什么在这个小块的代码吗?嗯,在我看来,这段代码有三个概念块。第一块组成的八行,是最长的。让我们运行它。

N = 8;T = 2;行= 1:N;关口=烫发(行);S =大小(关口,1);M = 0 (N, N, S);linearInd = sub2ind(大小(M), repmat(行,1,S),关口”,repmat (1: S、N 1));M (linearInd) = 1;谁
类属性名称大小字节8 M x8x40320 20643840双

这似乎是40320年董事会的集合。没有很多的解决方案,因此收集必须包含许多董事会金宝搏官方网站没有有效的解决方案。例如:

米(:,:45)
ans = 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0

有四个皇后主要antidiagonal排队,这并不是一个解决方案。

这组董事会已经通过观察,任何解决方案都必须构造一个女王在每一行和每一列一个女王。数组包含每个委员会都有这个属性。所有的计算魔法是线关口=烫发(行)。剩下的这一块是索引计算数组初始化并填写与皇后的位置关口

第二块是这条线:

dv = arrayfun (@ (k)马克斯([arrayfun (@ (x)和(诊断接头(M (:,:, k), x)), - T: T), arrayfun (@ (x)和(诊断接头(rot90 (M (:,:, k)), x)), - T: T)]), 1: S);

哇,有很多。我想这样总结:对于每一个董事会k在M,和每一个对角线和antidiagonal的最大金额。我们的想法是,构建,这样每个委员会都有一个女王在每一行和每一列一个皇后,所以你真的只需要检查董事会的对角线来确定它是一个解决方案。让我们来看看dv为45,我上面显示。

dv (45)
ans = 4

记得我的评论,董事会45以上4皇后在主antidiagonal排队?这就是为什么dv (45)是4。

最后一个块概念是消除所有的董事会没有解决方案。金宝搏官方网站我们通过消除所有的董事会dv > 1

米(:,:,dv > 1) = [];谁
类属性名称大小字节8 x8x92 47104双

它是。这是一个非常聪明的使用烫发和索引和arrayfun生成所有可能的解决方案。金宝搏官方网站谢谢,uu tii。




发表与MATLAB®R2017a

|
  • 打印

评论

留下你的评论,请点击在这里MathWorks账户登录或创建一个新的。