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

原创文章,转载请注明:八皇后问题-回溯法(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('
')
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