Availablecapturesforrook问题来源:https://leetcode-cn.com/problems/available-captures-for-rook问题是在一个8x8的棋盘上有一个白色的车(车).也可能有空方格、白象和黑兵。它们分别由字符“R”、“.”、“B”和“p”给出。大写字母代表白色棋子,小写字母代表黑色棋子。车按照国际象棋的规则移动:它选择四个主要方向(北、东、西、南)之一,然后朝那个方向移动,直到它选择停下来,到达棋盘的边缘,或者移动到同一个广场。捕获该方格上相反颜色的棋子。此外,车不能进入与其他友好(白色)主教相同的方格。返回车一次可以捕获的兵数。例1:输入:[[".",".",".",".",".",".",".","."],[".",".","".","p",".",".",".","."],[".",".",".","R",".",".","".","p"],[".",".",".",".",".",".",".","."],[".,"”,".",".",".",".",".","."],[".",".",".","p",".",".",".","."],[".",".",".",".",".",".",".","."],[".,".",".",".",".",".",".","."]]输出:3解释:在这个例子中,车可以吃掉所有的兵。示例2:输入:[[".",".",".",".",".",".",".","."],[".","p","p","p","p","p",".","."],[".","p","p","B","p","p",".","."],[".","p","B","R","B","p",".","."],[".","p","p","B","p","p",".","."],[".","p","p","p","p","p",".","."],[".",".",".",".",".",".",".","."],[".,".",".",".",".",".",".","."]]输出:0解释:Bishop阻止车吃掉任何兵。例3:输入:[[".",".",".",".",".",".",".","."],[".",".","".","p",".",".",".","."],[".",".",".","p",".",".",".","."],["p","p",".","R",".","p","B","."],[".",".",".",".",".",".",".","."],[".",".",".","B",".",".",".","."],[".",".",".","p",".",".",".","."],[".,".",".",".",".",".",".","."]]输出:3解释:车可以在位置b5、d6和f5吃兵。提示:棋盘.length==board[i].length==8boardi可以是'R','.','B'or'p',只有一个格子存在boardi=='R'以上图片来源来自LeetCodeLet我稍微吐槽一下解题思路,这道题从文中理解题意,总会遇到很多麻烦(下文会提到),这里举个例子来理解:whiterook(rook,主角),白主教(bishop,friendly),blackpawn(pawn,姑且称其为敌人),必须捕获黑pawn。谜题1:选择四个基本方向(北、东、西、南)中的一个并朝该方向移动,直到它选择停止、到达棋盘边缘或移动到同一个方格以捕获该方格上的相反颜色的pawn后面的内容确实有点啰嗦(移动到同一个方格中捕获同一个方格中的相反颜色的pawn),其实就是说当车(R)被发现的时候,从车的角度出发,选择北、南、西、东(即上、下、左、右),决定可以俘获的黑兵数量。迷恋2:返回车一次可以捕获的棋子数量。从这里的文字来看,感觉车(R)选择了一个方向,一个动作俘获的兵数(p)。但是结合例子,这里的一次是指[North,South,West,East]四个方向都算一次。这里有一点需要注意,见例3,当有两个黑兵在同一个位置时,车(R)只先吃掉暴露在它前面的兵,后面的兵不会被吃掉。明白题意后,我们大致说一下解题思路:先处理边界问题,防止棋子跳出棋盘;如果遇到白棋子(B,友方),此时停止,因为你们不能同时在同一个方格;如果遇到黑棋子(p,敌方),说明你已经找到了捕获对象,返回值为+1;如果你遇到一个.(这里指的是空棋盒),表示可以继续走棋;代码实现类解决方案:defnumRookCaptures(self,board:List[List[str]])->int:defmove(board,x,y,direction):#Constraintsarewithintheboardwhilex>=0andx<8andy>=0andy<8:#遇到象时停止ifboard[x][y]=='B':break#遇到黑兵时捕获ifboard[x][y]=='p':returnTrue#继续移动x+=direction[0]y+=direction[1]returnFalsedirections=[(0,1),(1,0),(0,-1),(-1,0)]forxinrange(8):foryinrange(8):#首先定位汽车(R)ifboard[x][y]=='R':res=0#移动到四方向,方向方向:如果移动(板,x,y,direction):res+=1returnres得到结果以上就是通过分析题意,直接按照题意中陈述的规则模拟棋子的走法,解决《车的可用捕获量》问题的主要内容的问题。
