From af56285b20570888dfbb8749625ecc9018820784 Mon Sep 17 00:00:00 2001 From: Exzrgs Date: Wed, 2 Oct 2024 23:51:11 +0900 Subject: [PATCH] complete --- NeetCode/n-queens/step1.py | 66 ++++++++++++++++++++++++++++++++++++++ NeetCode/n-queens/step2.py | 39 ++++++++++++++++++++++ 2 files changed, 105 insertions(+) create mode 100644 NeetCode/n-queens/step1.py create mode 100644 NeetCode/n-queens/step2.py diff --git a/NeetCode/n-queens/step1.py b/NeetCode/n-queens/step1.py new file mode 100644 index 0000000..e750305 --- /dev/null +++ b/NeetCode/n-queens/step1.py @@ -0,0 +1,66 @@ +""" +ダメだったやつ +""" + +class Solution: + def solveNQueens(self, n: int) -> List[List[str]]: + board = [[None] * n for _ in range(n)] + + def mark_vertical(w, mark): + for i in range(n): + if not board[i][w]: + board[i][w] = mark + + def mark_horizontal(r, mark): + for i in range(n): + if not board[r][i]: + board[r][i] = mark + + def mark_diagonal(r, w, mark): + for i in range(-n, n): + cur_r = r + i + cur_w = w + i + if (cur_r not in range(n) or + cur_w not in range(n) or + board[cur_r][cur_w] + ): continue + board[cur_r][cur_w] = mark + for i in range(-n, n): + cur_r = r + i + cur_w = w - i + if (cur_r not in range(n) or + cur_w not in range(n) or + board[cur_r][cur_w] + ): continue + board[cur_r][cur_w] = mark + + def mark_attack_tiles(r, w, mark): + mark_vertical(w, mark) + mark_horizontal(r, mark) + mark_diagonal(r, w, mark) + + def fill_none(): + for i in range(n): + for j in range(n): + if not board[i][j]: + board[i][j] = "." + + res = [] + + def append_queen_paterns(): + for i in range(n): + for j in range(n): + if not board[i][j]: + board[i][j] = "Q" + mark_attack_tiles(i, j, ".") + append_queen_paterns() + board[i][j] = None + mark_attack_tiles(i, j, None) + fill_none() + formatted_board = [] + for row in board: + formatted_board.append("".join(row)) + res.append(formatted_board) + + append_queen_paterns() + return res diff --git a/NeetCode/n-queens/step2.py b/NeetCode/n-queens/step2.py new file mode 100644 index 0000000..4a20c8b --- /dev/null +++ b/NeetCode/n-queens/step2.py @@ -0,0 +1,39 @@ +""" +左上から右下への斜めは和が一定 + colが増えたらrowが減るから +左下から右上への斜めは差が一定 + colが増えたらrowも増えるから +""" + +# time: < n^n +# space: n^2 +class Solution: + def solveNQueens(self, n: int) -> List[List[str]]: + board = [["."] * n for _ in range(n)] + res = [] + ng_col = set() + ng_pros_diag = set() + ng_minus_diag = set() + + def backtrack(row): + if row == n: + res.append(["".join(row) for row in board]) + return + + for col in range(n): + if col in ng_col or row + col in ng_pros_diag or row - col in ng_minus_diag: + continue + board[row][col] = "Q" + ng_col.add(col) + ng_pros_diag.add(row + col) + ng_minus_diag.add(row - col) + + backtrack(row + 1) + + board[row][col] = "." + ng_col.remove(col) + ng_pros_diag.remove(row + col) + ng_minus_diag.remove(row - col) + + backtrack(0) + return res