如何检测8×8棋盘上两个皇后是否处于共竖线或对角线的危险状态?
嘿,我太懂你被一堆for循环绕得晕头转向的感觉了——其实完全不用折腾整个棋盘数组来检测皇后的危险状态!咱们直接用两个皇后的坐标,靠简单的数学判断就能搞定,比你现在的思路简洁太多。
核心检测逻辑(直接用坐标判断,无需操作棋盘)
先明确两个皇后的坐标定义:whiteQueen = [白皇后行号, 白皇后列号],blackQueen = [黑皇后行号, 黑皇后列号],咱们直接基于这两组数值判断:
1. 检测同一竖线
竖线的核心特征是两个皇后的列号完全相同,也就是坐标的第二个值相等:
const sameColumn = whiteQueen[1] === blackQueen[1];
2. 检测同一对角线
皇后走对角线时,每移动一行就会同步移动一列,所以行号的差值和列号的差值绝对值是相等的,用这个规律就能判断:
const sameDiagonal = Math.abs(whiteQueen[0] - blackQueen[0]) === Math.abs(whiteQueen[1] - blackQueen[1]);
3. 结合你已经掌握的水平线检测
水平线的判断是行号相同,也就是坐标的第一个值相等:
const sameRow = whiteQueen[0] === blackQueen[0];
最终危险状态判断
只要满足以上任意一个条件,两个皇后就处于危险状态:
const danger = sameRow || sameColumn || sameDiagonal;
简化后的完整代码示例
直接跳过所有绘制棋盘的冗余步骤,用几行代码就能得到结果:
const whiteQueen = [2, 5]; const blackQueen = [5, 0]; const sameRow = whiteQueen[0] === blackQueen[0]; const sameColumn = whiteQueen[1] === blackQueen[1]; const sameDiagonal = Math.abs(whiteQueen[0] - blackQueen[0]) === Math.abs(whiteQueen[1] - blackQueen[1]); const danger = sameRow || sameColumn || sameDiagonal; console.log(danger); // 这里会输出false,因为你的两个皇后不在同一行、列或对角线
为什么你的原有思路绕了弯路?
你原来的代码里反复遍历棋盘绘制皇后、重置数值,其实这些操作对于检测危险状态来说完全没必要——我们只需要两个皇后的坐标信息,根本不需要修改整个棋盘数组。把问题聚焦到坐标本身,就能大幅简化代码逻辑。
内容的提问来源于stack exchange,提问作者user3697034




