[Swift]LeetCode1222. 可以攻击国王的皇后 | Queens That Can Attack the King
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
➤微信公众号:山青咏芝(let_us_code)
➤博主域名:https://www.zengqiang.org
➤GitHub地址:https://github.com/strengthen/LeetCode
➤原文地址:https://www.cnblogs.com/strengthen/p/11627004.html
➤如果链接不是山青咏芝的博客园地址,则可能是爬取作者的文章。
➤原文已修改更新!强烈建议点击原文地址阅读!支持作者!支持原创!
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
On an 8x8 chessboard, there can be multiple Black Queens and one White King.
Given an array of integer coordinates queens that represents the positions of the Black Queens, and a pair of coordinates king that represent the position of the White King, return the coordinates of all the queens (in any order) that can attack the King.
Example 1:
Input: queens = [[0,1],[1,0],[4,0],[0,4],[3,3],[2,4]], king = [0,0]
Output: [[0,1],[1,0],[3,3]]
Explanation:
The queen at [0,1] can attack the king cause they're in the same row.
The queen at [1,0] can attack the king cause they're in the same column.
The queen at [3,3] can attack the king cause they're in the same diagnal.
The queen at [0,4] can't attack the king cause it's blocked by the queen at [0,1].
The queen at [4,0] can't attack the king cause it's blocked by the queen at [1,0].
The queen at [2,4] can't attack the king cause it's not in the same row/column/diagnal as the king.
Example 2:
Input: queens = [[0,0],[1,1],[2,2],[3,4],[3,5],[4,4],[4,5]], king = [3,3]
Output: [[2,2],[3,4],[4,4]]
Example 3:
Input: queens = [[5,6],[7,7],[2,1],[0,7],[1,6],[5,1],[3,7],[0,3],[4,0],[1,2],[6,3],[5,0],[0,4],[2,2],[1,1],[6,4],[5,4],[0,0],[2,6],[4,5],[5,2],[1,4],[7,5],[2,3],[0,5],[4,2],[1,0],[2,7],[0,1],[4,6],[6,1],[0,6],[4,3],[1,7]], king = [3,4]
Output: [[2,3],[1,4],[1,6],[3,7],[4,3],[5,4],[4,5]]
Constraints:
1 <= queens.length <= 63
queens[0].length == 2
0 <= queens[i][j] < 8
king.length == 2
0 <= king[0], king[1] < 8
At most one piece is allowed in a cell.
在一个 8x8 的棋盘上,放置着若干「黑皇后」和一个「白国王」。
「黑皇后」在棋盘上的位置分布用整数坐标数组 queens 表示,「白国王」的坐标用数组 king 表示。
「黑皇后」的行棋规定是:横、直、斜都可以走,步数不受限制,但是,不能越子行棋。
请你返回可以直接攻击到「白国王」的所有「黑皇后」的坐标(任意顺序)。
示例 1:
输入:queens = [[0,1],[1,0],[4,0],[0,4],[3,3],[2,4]], king = [0,0]
输出:[[0,1],[1,0],[3,3]]
解释:
[0,1] 的皇后可以攻击到国王,因为他们在同一行上。
[1,0] 的皇后可以攻击到国王,因为他们在同一列上。
[3,3] 的皇后可以攻击到国王,因为他们在同一条对角线上。
[0,4] 的皇后无法攻击到国王,因为她被位于 [0,1] 的皇后挡住了。
[4,0] 的皇后无法攻击到国王,因为她被位于 [1,0] 的皇后挡住了。
[2,4] 的皇后无法攻击到国王,因为她和国王不在同一行/列/对角线上。
示例 2:
输入:queens = [[0,0],[1,1],[2,2],[3,4],[3,5],[4,4],[4,5]], king = [3,3]
输出:[[2,2],[3,4],[4,4]]
示例 3:
输入:queens = [[5,6],[7,7],[2,1],[0,7],[1,6],[5,1],[3,7],[0,3],[4,0],[1,2],[6,3],[5,0],[0,4],[2,2],[1,1],[6,4],[5,4],[0,0],[2,6],[4,5],[5,2],[1,4],[7,5],[2,3],[0,5],[4,2],[1,0],[2,7],[0,1],[4,6],[6,1],[0,6],[4,3],[1,7]], king = [3,4]
输出:[[2,3],[1,4],[1,6],[3,7],[4,3],[5,4],[4,5]]
提示:
1 <= queens.length <= 63
queens[0].length == 2
0 <= queens[i][j] < 8
king.length == 2
0 <= king[0], king[1] < 8
一个棋盘格上最多只能放置一枚棋子。
12ms
1 class Solution { 2 func queensAttacktheKing(_ queens: [[Int]], _ king: [Int]) -> [[Int]] { 3 var m = [[Int]](repeating:[Int](repeating: 0, count:8), count:8) 4 for q in queens { 5 m[q[0]][q[1]] = 1 6 } 7 8 let dirs = [(-1,-1), (-1,0), (-1,1), (1,0), (1,1), (0,1), (1,-1), (0,-1)] 9 10 var ans = [[Int]]() 11 for d in dirs { 12 var (i, j) = (king[0], king[1]) 13 repeat { 14 i += d.0 15 j += d.1 16 } while i >= 0 && i < 8 && j >= 0 && j < 8 && m[i][j] == 0 17 if i >= 0 && i < 8 && j >= 0 && j < 8 { 18 ans.append([i, j]) 19 } 20 } 21 22 return ans 23 } 24 }
16ms
1 class Solution { 2 func queensAttacktheKing(_ queens: [[Int]], _ king: [Int]) -> [[Int]] { 3 let setOfQueens = Set(queens) 4 5 let kingRow = king[0] 6 let kingCol = king[1] 7 8 var result = [[Int]]() 9 10 for i in stride(from: -1, through: 1, by: 2) { 11 for j in stride(from: -1, through: 1, by: 2) { 12 13 } 14 } 15 16 // to the right 17 for i in kingCol..<8 { 18 if i < 7 && setOfQueens.contains([kingRow, i+1]) { 19 result.append([kingRow, i+1]) 20 break 21 } 22 } 23 24 // to the left 25 for i in (0...kingCol).reversed() { 26 if i > 0 && setOfQueens.contains([kingRow, i-1]) { 27 result.append([kingRow, i-1]) 28 break 29 } 30 } 31 32 // down 33 for i in kingRow..<8 { 34 if i < 7 && setOfQueens.contains([i+1, kingCol]) { 35 result.append([i+1, kingCol]) 36 break 37 } 38 } 39 40 // up 41 for i in (0...kingRow).reversed() { 42 if i > 0 && setOfQueens.contains([i-1, kingCol]) { 43 result.append([i-1, kingCol]) 44 break 45 } 46 } 47 48 var index = 1 49 while (kingRow + index) < 8 && (kingCol + index) < 8 { 50 if setOfQueens.contains([kingRow+index, kingCol+index]) { 51 result.append([kingRow+index, kingCol+index]) 52 break 53 } 54 index += 1 55 } 56 57 index = 1 58 while (kingRow-index) >= 0 && (kingCol-index) >= 0 { 59 if setOfQueens.contains([kingRow-index, kingCol-index]) { 60 result.append([kingRow-index, kingCol-index]) 61 break 62 } 63 index += 1 64 } 65 66 index = 1 67 while (kingRow+index) < 8 && (kingCol-index) >= 0 { 68 if setOfQueens.contains([kingRow+index, kingCol-index]) { 69 result.append([kingRow+index, kingCol-index]) 70 break 71 } 72 index += 1 73 } 74 75 var a = kingRow-1 76 var b = kingCol+1 77 while a >= 0 && b < 8 { 78 if setOfQueens.contains([a, b]) { 79 result.append([a, b]) 80 break 81 } 82 a -= 1 83 b += 1 84 } 85 86 return result 87 } 88 }
20ms
1 class Solution { 2 func queensAttacktheKing(_ queens: [[Int]], _ king: [Int]) -> [[Int]] { 3 let directions = [(0,1),(0,-1),(1,0),(-1,0),(-1,-1),(-1,1),(1,-1),(1,1)] 4 5 var result = [[Int]]() 6 for (dx,dy) in directions { 7 var (x,y) = (king[0] + dx,king[1] + dy) 8 9 while x >= 0 && y >= 0 && x < 8 && y < 8 { 10 if queens.contains([x,y]) { 11 result.append([x,y]) 12 break 13 } 14 (x,y) = (x+dx,y+dy) 15 } 16 } 17 18 return result 19 } 20 }
24ms
1 class Solution { 2 func queensAttacktheKing(_ queens: [[Int]], _ king: [Int]) -> [[Int]] { 3 var posD = [[-1, 0],[1, 0],[0, 1],[0, -1],[-1, -1],[1, -1],[1, 1],[-1, 1]] 4 var kx = king[0] 5 var ky = king[1] 6 var op = [[Int]]() 7 for n in posD{ 8 //print("try D \(n)") 9 var nx = kx 10 var ny = ky 11 outerLoop: for i in 0...8 { 12 nx = nx + n[0] 13 ny = ny + n[1] 14 //print("try D \(n) \([nx, ny])") 15 if queens.contains([nx, ny]) { 16 op.append([nx, ny]) 17 break outerLoop 18 } 19 } 20 } 21 return op 22 } 23 }
28ms
1 class Solution { 2 func queensAttacktheKing(_ queens: [[Int]], _ king: [Int]) -> [[Int]] { 3 let steps = [[-1,-1],[0,-1],[1,-1], 4 [-1, 0], [1, 0], 5 [-1, 1],[0, 1],[1, 1]] 6 var r = [[Int]]() 7 var m = Set<Int>() 8 for queen in queens { 9 m.insert(queen[0]*10 + queen[1]) 10 } 11 for step in steps { 12 var x = king[0] 13 var y = king[1] 14 while true { 15 x += step[0] 16 y += step[1] 17 if x >= 0 && x < 8 && y >= 0 && y < 8 { 18 if m.contains(x * 10 + y) { 19 r.append([x, y]) 20 break 21 } 22 } else { 23 break 24 } 25 } 26 } 27 return r 28 } 29 }