人工智能MATLAB实现回溯八皇后问题

来源:互联网 发布:netstat 过滤端口 编辑:程序博客网 时间:2024/06/13 22:08



  

一、实验目的:

用回溯法解决八皇后问题 。

 

二、实验内容:

1、阅读C语言书写的回溯法解决八皇后问题代码。

2、参考C语言代码,使用Matlab写出回溯法解决八皇后问题代码。

3、要求对关键代码进行注释,带有注释的行要求达到1/3。

 

三、程序清单:

 

Queens.m

%递归搜索试探放置皇后

function Q= Queens(n)

global Indexes;

A=ones(n,n);            %初始化棋盘

Indexes=zeros(1,n);  %记录皇后的位置坐标

i=1;                          %行号

j=1;                   %列号

count=0;            %统计解的个数

while (i>0)

    whilej<=n

       if  Judge(i,j)         %找不会攻击其他皇后的位置

           A(i,j)=8;         %8代表皇后

           Indexes(i)=j;

           break;                    %跳出本循环

       else

           j=j+1;              %探查下一个位置

       end

    end

  

    ifj<=n                     %如果找到合适的位置,则找下一个

       i=i+1;

       j=1;

   else                          %如果找不到合适的位置,则回溯,退回到上一行

       i=i-1;

       if i~=0

           j=Indexes(i);

           A(i,j)=1;                       %还原值

           Indexes(i)=0;                %去掉保留的坐标

           j=j+1;                     %从上一个皇后的后面一个位置开始找

       end

    end

  

    if(Indexes(n)~=0)                              %如果找到一个解

       count=count+1;

       disp(A);                  %输出矩阵

    end

end

disp([num2str(n),'皇后问题解的个数为:',num2str(count)]);        %输出解的个数

end

 

 

 

%子函数,判断能否放在位置(x,y)

Judge.m

function p=Judge (x,y)

global Indexes;

%判断是否会攻击已放置的皇后(位于同一对角线或同一行列上)

fora=1:x-1                      %a为行号

   b=Indexes(a);          %b为已放置皇后所在列号

          if (x-y==a-b || x+y==a+b || x==a || y==b)

%判断是否位于同一对角线和同一行列上

    if(x-y==a-b || x+y==a+b || y==b)  %判断是否位于同一对角线和同一列上

       p=0;

       return;                                   %退出子函数

    end

end

p=1;

end

 

 

 

 

主函数

Main.m

clear;    %数据清零

clc;      %命令窗记录清空

n=8;      %八皇后问题,设8*8的矩阵,n赋初值为8

Queens(n)  %调用函数

0 0