======================

题一

=========================================================================================================================

在一个 8x8 的棋盘上,放置着若干「黑皇后」和一个「白国王」。

「黑皇后」在棋盘上的位置分布用整数坐标数组 queens
表示,「白国王」的坐标用数组 king 表示。

「黑皇后」的行棋规定是:横、直、斜都可以走,步数不受限制,但是,不能越子行棋。

请你返回可以直接攻击到「白国王」的所有「黑皇后」的坐标(任意顺序)。

  • 输入: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] 的皇后无法攻击到国王,因为她和国王不在同一行/列/对角线上。

提示

  • 1 <= queens.length <= 63
  • queens[0].length == 2
  • 0 <= queens[i][j] < 8
  • king.length == 2
  • 0 <= king[0], king[1] < 8
  • 一个棋盘格上最多只能放置一枚棋子。

审题

从解释和提示中我们可以得到两条重要的线索:

  • king的取值范围:0 <= x < 8
  • 皇后只能走一个方向,不能绕路走。要么走横线,要么走竖线,要么走对角线。
  • 只需找到离king最近的能攻击到king的皇后

解题思路

无需考虑king在棋盘的什么位置,直接以king为中心进行八方向探索,直到找到最近的皇后。我们可以创建一个含有八个不同方向的坐标,如(1,0)就是往右一格一格进行搜索。

(一开始浪费时间在考虑king的位置上了,后来一想直接限定king的探索范围就好了)

class Solution:                
    def queensAttacktheKing(self, queens: List[List[int]], king: List[int]) -> List[List[int]]:  
         # 上    右上   右    右下    下    左下    左     左上    
         direction = [[-1,0],[-1,1],[0,1],[1,1],[1,0],[1,-1],[0,-1],[-1,-1]]  
         queens = {(x,y) for x,y in queens}  
         res = []               
         # 八方向查找           
         for a,b in direction:  
         # 找到皇后后,x,   
         y回到初始位置继续往另外个方向探索  
         x = king[0]        
         y = king[1]        

         while 0 <= x < 8 and 0 <= y < 8:  
             x += a         
             y += b         
         # 这里本身是想对queens做for循环遍历来做比对的,因为这里本身已经在for循环中  
         #了,会造成多余的操作。后来借鉴了别人的代码,把queens改为字典了。   

         if(x,y) in queens:  
             res.append([x,y])  
             break      
        return res             
  执行用时 :                     
  48 ms                          
  内存消耗 :                     
  14 MB                  

总结

解题思路基本上有了,但是花了很多时间在处理for循环上始终找不到最优的方式去匹配坐标。学到了可以通过字典的形式来做匹配,既方便还不用再创建个循环。