为有牺牲多壮志,敢教日月换新天。

[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
➤如果链接不是山青咏芝的博客园地址,则可能是爬取作者的文章。
➤原文已修改更新!强烈建议点击原文地址阅读!支持作者!支持原创!
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

热烈欢迎,请直接点击!!!

进入博主App Store主页,下载使用各个作品!!!

注:博主将坚持每月上线一个新app!!!

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 }

 

posted @ 2019-10-06 12:29  为敢技术  阅读(272)  评论(0编辑  收藏  举报