From 4fdbed1ebd495e72a7d8ed6bf7fdd99fadcecc03 Mon Sep 17 00:00:00 2001 From: aQua <6028869+aQuaYi@users.noreply.github.com> Date: Sat, 11 Jan 2020 15:21:59 +0800 Subject: [PATCH] fix #57 --- Algorithms/0051.n-queens/n-queens.go | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/Algorithms/0051.n-queens/n-queens.go b/Algorithms/0051.n-queens/n-queens.go index bf680427d..da836ef13 100755 --- a/Algorithms/0051.n-queens/n-queens.go +++ b/Algorithms/0051.n-queens/n-queens.go @@ -32,8 +32,27 @@ func dfs(r int, cols, d1, d2 []bool, board []string, res *[][]string) { n := len(board) for c := 0; c < len(board); c++ { + // 把棋盘想象成 + // 以左上角为坐标原点 [0,0] + // C 轴正方向向右 + // R 轴正方向向下 + // 的坐标系。 + // 这样的话,每个格子就都有了自己的坐标值 [c,r] + // + // 对于 '\' 方向的斜线而言 + // 同一个斜线上的格子,利用其坐标 [c,r] 计算 r-c 的结果相同, + // 不同斜线上 r-c 的结果不同。 + // 所以可以用 r-c 代表不同的 '\' 方向的斜线的编号。 + // 但是 r-c 有可能是负值,无法作为切片的索引值 + // 所以 +n,可知 r-c+n >= 0 + // 所以,使用 r-c+n 作为 '\' 方向斜线切片的索引值。 + // 对于 '/' 方向的斜线而言 + // 同一个斜线上的格子,利用其坐标 [c,r] 计算 r+c 的结果相同, + // 不同斜线上 r+c 的结果不同。 + // 所以可以用 r+c 代表不同的 '/' 方向的斜线的编号。 + // 所以,使用 r+c 作为 '/' 方向斜线切片的索引值。 id1 := r - c + n - id2 := 2*n - r - c - 1 + id2 := r + c if !cols[c] && !d1[id1] && !d2[id2] { b := make([]byte, n) for i := range b {