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