八N皇后问题

1 问题的提出

在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法

我们的任务就是用MATLAB进行求解

2 数学模型的构建

首先我们分析题目就是

任意两个皇后都不能处于同一行、同一列或同一斜线上

复制代码
global board sum;
board = zeros(8,8);
sum = 0;
dfs(1);
disp(sum);

function dfs(x)
    global board sum;
    if x > 8
        sum = sum + 1;
        return;
    end

    for i = 1:8
        if issafe(x,i,board)
            board(x,i) = 1;
            dfs(x+1);
            board(x,i) = 0;
        end
    end
end

function safe = issafe(row, col, board)
    safe = true;
    
    % 检查列
    for i = 1:row-1
        if board(i, col) == 1
            safe = false;
            return;
        end
    end

    % 检查右上角
    i = row - 1;
    j = col + 1;
    while i >= 1 && j <= 8
        if board(i, j) == 1
            safe = false;
            return;
        end
        i = i - 1;
        j = j + 1;
    end

    % 检查左上角
    i = row - 1;
    j = col - 1;
    while i >= 1 && j >= 1
        if board(i, j) == 1
            safe = false;
            return;
        end
        i = i - 1;
        j = j - 1;
    end
end

我们要学习这里面的思想

3 模块1 dfs搜索函数

复制代码
function dfs(x)
    global board sum;
    if x > 8
        sum = sum + 1;
        return;
    end

    for i = 1:8
        if issafe(x,i,board)
            board(x,i) = 1;
            dfs(x+1);
            board(x,i) = 0;
        end
    end
end

我们有8个皇后,那就是for循环循环8行,每次放置一个棋子就进行一次判断,然后判断这个棋子可不可以落在这里如过可以那么久进入到下一行,x进行+1秒如果不可以的话,那么就进入这一行的下一个格子下一个,这就是枚举8行8列

当这个x > 8的话,那么就是放置成功了

4 检查模块

复制代码
function safe = issafe(row, col, board)
    safe = true;
    
    % 检查列
    for i = 1:row-1
        if board(i, col) == 1
            safe = false;
            return;
        end
    end

    % 检查右上角
    i = row - 1;
    j = col + 1;
    while i >= 1 && j <= 8
        if board(i, j) == 1
            safe = false;
            return;
        end
        i = i - 1;
        j = j + 1;
    end

    % 检查左上角
    i = row - 1;
    j = col - 1;
    while i >= 1 && j >= 1
        if board(i, j) == 1
            safe = false;
            return;
        end
        i = i - 1;
        j = j - 1;
    end
end

首先我们的行是已经操作完的了,就是在判断行的话是在递归的过程中进行讨论的,然后就是只需要判断这个列是否成立就好了,然后斜边的话,那不就是直接判断左上角和右上角就好了

左上角和右上角的检查

复制代码
    % 检查右上角
    i = row - 1;
    j = col + 1;
    while i >= 1 && j <= 8
        if board(i, j) == 1
            safe = false;
            return;
        end
        i = i - 1;
        j = j + 1;
    end

我们知道右上角就是不断的进行加1嘛,这个行的话,列就是不断地进行减1,左上角就是反着地

相关推荐
一直都在57213 分钟前
数据结构入门:哈希表和树结构
数据结构·算法·散列表
宵时待雨13 分钟前
C语言笔记归纳19:动态内存管理
java·开发语言·算法
喇一渡渡16 分钟前
Java力扣---滑动窗口(2)
算法·leetcode·职场和发展
智驱力人工智能19 分钟前
山区搜救无人机人员检测算法 技术攻坚与生命救援的融合演进 城市高空无人机人群密度分析 多模态融合无人机识别系统
人工智能·深度学习·算法·架构·无人机·边缘计算
郝学胜-神的一滴33 分钟前
OpenGL中的glDrawArrays函数详解:从基础到实践
开发语言·c++·程序人生·算法·游戏程序·图形渲染
_OP_CHEN33 分钟前
【算法基础篇】(三十四)图论基础深度解析:从概念到代码,玩转图的存储与遍历
算法·蓝桥杯·图论·dfs·bfs·算法竞赛·acm/icpc
王璐WL41 分钟前
【数据结构】栈和队列及相关算法题
数据结构·算法
麒qiqi41 分钟前
Linux 线程(POSIX)核心教程
linux·算法
Zhi.C.Yue43 分钟前
React 的桶算法详解
前端·算法·react.js
小热茶1 小时前
浮点数计算专题【五、 IEEE 754 浮点乘法算法详解---基于RISCV的FP32乘法指令在五级流水线的运行分析与SystemC实现】
人工智能·嵌入式硬件·算法·systemc