八皇后问题-回溯法(MATLAB)

时间:2021-08-27 14:34:20

原创文章,转载请注明:八皇后问题-回溯法(MATLAB) By Lucio.Yang

1.问题描述

  八皇后问题是十九世纪著名数学家高斯于1850年提出的。问题是:在8*8的棋盘上摆放8个皇后,使其不能互相攻击,即任意的两个皇后不能处在同意行,同一列,或同意斜线上。

2.matlab代码

function PlaceQueen(row,stack,N)%回溯法放置皇后
if row>N
PrintQueen(N,stack);%打印棋盘
else
for col=1:N
stack(row)=col;
if row==1||Conflict(row,col,N,stack)%检测是否冲突
PlaceQueen(row+1,stack,N);
end
stack(row)=0;
end
end
%子函数:检测冲突
function result=Conflict(row,col,N,stack)%检测是否冲突
result=1;
for i=1:row-1
if stack(i)~=0
if ((stack(i)==col)||(abs(row-i)==abs(col-stack(i))))%是否产生冲突:在同一直线,斜线上
result=0;
break;
end
if result==0
break;
end
end
end
%子函数:打印棋盘信息
function PrintQueen(N,stack)
global solutionNum; %定义全局变量,来累积方法数
solutionNum=solutionNum+1;
disp(['第',num2str(solutionNum),'种方法:'])
for i=1:N
for j=1:N
if j==stack(i)
fprintf('1 ')
else
fprintf('0 ')
end
end
fprintf('\n')
end

PlaceQueen.m

clear all
clc global solutionNum;
solutionNum=0;%全局变量记录方法数
N=8;%皇后个数
%matrix=zeros(N);%存储皇后位置信息
stack=[0 0 0 0 0 0 0 0];
PlaceQueen(1,stack,N)%调用放置方法

queen.m