目录链接:
力扣编程题-解法汇总_分享+记录-CSDN博客
GitHub同步刷题项目:
https://github.com/September26/java-algorithms
原题链接:力扣
描述:
在 n*m
大小的棋盘中,有黑白两种棋子,黑棋记作字母 "X"
, 白棋记作字母 "O"
,空余位置记作 "."
。当落下的棋子与其他相同颜色的棋子在行、列或对角线完全包围(中间不存在空白位置)另一种颜色的棋子,则可以翻转这些棋子的颜色。
「力扣挑战赛」黑白翻转棋项目中,将提供给选手一个未形成可翻转棋子的棋盘残局,其状态记作 chessboard
。若下一步可放置一枚黑棋,请问选手最多能翻转多少枚白棋。
注意:
- 若翻转白棋成黑棋后,棋盘上仍存在可以翻转的白棋,将可以 继续 翻转白棋
- 输入数据保证初始棋盘状态无可以翻转的棋子且存在空余位置
示例 1:
输入:chessboard = ["....X.","....X.","XOOO..","......","......"]
输出:3
解释: 可以选择下在 [2,4]
处,能够翻转白方三枚棋子。
示例 2:
输入:chessboard = [".X.",".O.","XO."]
输出:2
解释: 可以选择下在 [2,2]
处,能够翻转白方两枚棋子。
示例 3:
输入:chessboard = [".......",".......",".......","X......",".O.....","..O....","....OOX"]
输出:4
解释: 可以选择下在 [6,3]
处,能够翻转白方四枚棋子。
提示:
1 <= chessboard.length, chessboard[i].length <= 8
chessboard[i]
仅包含 "."、"O"
和 "X"
解题思路:
/**
* LCP 41. 黑白翻转棋
* 解题思路:
* 有可能没有太好的思路,这题的限制是8*8的棋盘,所以可以使用穷举的策略。
* 每个位置,都计算出放入黑子之后的所有影响到的白棋。
* 首先把chessboard转换为二位int类型的数组board,每个位置上,0代表是空的,1代表放的是白棋,2代表放的是黑棋。
* 所以searchDirection方法中,输入值为x,y坐标,以及二维数组board。
* 然后使用广度优先搜索,构建一个队列,队列中的初始值就是x,y,因为后面遍历中的过程中可能会添加新的。
* 然后分别向8个方向生成新的位置newX,newY,然后查看是否满足,如果满足,则一条路径上所有的点都加入到队列中。
* 然后继续下一轮的循环,知道队列为空。
*
*/
代码:
#include
#include