You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何定位N阶方阵中任意元素的主、副对角线位置?

方阵对角线定位与八皇后问题思路解析

一、主/副对角线定位规律

1. 主对角线(\方向)

你总结的起始点规律是正确的,本质上主对角线上所有元素的行号减列号(i-j)为固定值。比如示例中的A21,i-j=2-1=1,同主对角线的A10(1-0=1)、A32(3-2=1)都符合这个特征。

如果要生成整条主对角线的位置,除了从起始点遍历,也可以直接用这个固定值筛选:遍历方阵内所有(x,y),只要x-y等于目标元素的i-j,就属于这条主对角线。

2. 副对角线(/方向)

副对角线的核心特征是所有元素的行号加列号(i+j)为固定值。比如示例中的A21,i+j=2+1=3,同副对角线的A03(0+3=3)、A12(1+2=3)、A31(3+1=3)完全匹配。

对应的起始点规律(针对N×N方阵,目标元素位置为(i,j),记sum = i+j):

  • 当sum < N时,起始点为(0, sum)(从第一行开始)
  • 当sum >= N时,起始点为(sum - (N-1), N-1)(从最后一列开始)

以示例为例,N=5,sum=3 <5,起始点是(0,3),和示例中的副对角线起始元素A03一致。

二、八皇后问题思路确认与优化建议

你的实现思路完全正确:通过分别判断同行、同列、同对角线来检测皇后间的攻击关系,符合八皇后问题的核心约束。

这里给几个优化方向:

  1. 简化对角线判断逻辑:不需要先获取整条对角线的所有位置再检查,直接比较后续皇后与第一个皇后的行差和列差即可——主对角线满足行差绝对值等于列差绝对值,副对角线满足行加列的和相等。这样能省去遍历对角线的开销,逻辑更高效:

    public boolean anyAtTheSameDiagonal(Queen... queens) {
        if (queens.length < 2) return false;
        Queen first = queens[0];
        int firstRow = first.getRow();
        int firstCol = first.getCol();
        for (int i = 1; i < queens.length; i++) {
            Queen current = queens[i];
            int rowDiff = Math.abs(current.getRow() - firstRow);
            int colDiff = Math.abs(current.getCol() - firstCol);
            if (rowDiff == colDiff) {
                return true;
            }
        }
        return false;
    }
    

    这个版本不需要依赖ChessBoard对象,代码更简洁。

  2. 增加边界校验:在皇后位置相关方法中加入范围检查,避免出现行/列号超出方阵边界的错误。

  3. 启发式算法前置优化:如果后续要实现启发式搜索(比如冲突计数),可以提前维护每行、每列、每条对角线的冲突状态,而不是每次都遍历皇后判断,这样能显著提升算法运行效率。

内容的提问来源于stack exchange,提问作者Arthur Brenno

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 05:22:45