(1)问题描述与算法介绍
四皇后或者多皇后问题是研究人工智能的一个基础问题,问题具体是什么网上有很多了,就不详细说了,我这里就matlab上如何解决的参考和修改写了一些程序代码。四皇后问题的解决方案很多,本文主要采用的是回溯算法来解决的。
(2)代码详情:
function Q = Queen
global index; %定义全局变量
n = 4; %这个可以修改从而是多皇后问题
A=zeros(n,n); %初始化矩阵
index = zeros(1,n);
i=1;%行号
j=1;%列号
%-------------------------------------------
while(i>0)
%%-----------对于固定的某一行上看是否有符合的--------
while(j<=n)
if safeplace(i,j) %检测是否可以放置
A(i,j) = 1;
index(i) = j; %可以放置,记录位置
break; %同时退出本行寻找
else
j=j+1; %不可以放置,到下一个位置检测
end
End
%%-------------------------------
if j<=n %该行可以找到,到下一行
i = i+1; %下一行
j=1; %该行可以找到,则在下一行上又从第一个开始检测
else %不可以找到,回溯回上一行
i=i-1; %回溯到上一行
if i~=0 %不为0,说明还有可能,为0那么就结束了,这是程序结束的关键
j=index(i); %记录上一行位置
A(i,j)=0; %对于位置清0
index(i)=0; %对应标记清0
j=j+1; %下一列
end
End
%%------------------------------------
if (index(n)~=0) %最后一行标记不为0,则能找到一个解
disp(A); %显示解的矩阵
End
%%--------------------------------------
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function p=safeplace(x,y) %安全性检测
global index;
for a = 1:x-1
b = index(a);
if(x==a||y==b||x-y==a-b||x+y==a+b) %位置不能同行同列同斜线
p=0;
return;
end
end
p=1;
(3)结果显示
现在在命令窗口直接运行queen函数即可,得到结果如下:
>> queen
0 1 0 0
0 0 0 1
1 0 0 0
0 0 1 0
0 0 1 0
1 0 0 0
0 0 0 1
0 1 0 0
可以看到这两种情况,当然改变n的值可以运行多皇后问题了。。。