5827. 检查操作是否合法

219 阅读2分钟

这是我参与8月更文挑战的第8天,活动详情查看:8月更文挑战

5827. 检查操作是否合法

给你一个下标从 0 开始的 8 x 8 网格 board ,其中 board[r][c] 表示游戏棋盘上的格子 (r, c) 。棋盘上空格用 '.' 表示,白色格子用 'W' 表示,黑色格子用 'B' 表示。

游戏中每次操作步骤为:选择一个空格子,将它变成你正在执行的颜色(要么白色,要么黑色)。但是,合法 操作必须满足:涂色后这个格子是 好线段的一个端点 (好线段可以是水平的,竖直的或者是对角线)。

好线段 指的是一个包含 三个或者更多格子(包含端点格子)的线段,线段两个端点格子为 同一种颜色 ,且中间剩余格子的颜色都为 另一种颜色 (线段上不能有任何空格子)。你可以在下图找到好线段的例子: 在这里插入图片描述

给你两个整数 rMove 和 cMove 以及一个字符 color ,表示你正在执行操作的颜色(白或者黑),如果将格子 (rMove, cMove) 变成颜色 color 后,是一个 合法 操作,那么返回 true ,如果不是合法操作返回 false 。

  • 示例 1:

在这里插入图片描述

输入:board = [[".",".",".","B",".",".",".","."],[".",".",".","W",".",".",".","."],[".",".",".","W",".",".",".","."],[".",".",".","W",".",".",".","."],["W","B","B",".","W","W","W","B"],[".",".",".","B",".",".",".","."],[".",".",".","B",".",".",".","."],[".",".",".","W",".",".",".","."]], rMove = 4, cMove = 3, color = "B" 输出:true 解释:'.','W' 和 'B' 分别用颜色蓝色,白色和黑色表示。格子 (rMove, cMove) 用 'X' 标记。 以选中格子为端点的两个好线段在上图中用红色矩形标注出来了。

  • 示例 2:

输入:board = [[".",".",".",".",".",".",".","."],[".","B",".",".","W",".",".","."],[".",".","W",".",".",".",".","."],[".",".",".","W","B",".",".","."],[".",".",".",".",".",".",".","."],[".",".",".",".","B","W",".","."],[".",".",".",".",".",".","W","."],[".",".",".",".",".",".",".","B"]], rMove = 4, cMove = 4, color = "W" 输出:false 解释:虽然选中格子涂色后,棋盘上产生了好线段,但选中格子是作为中间格子,没有产生以选中格子为端点的好线段。

提示:

board.length == board[r].length == 8 0 <= rMove, cMove < 8 board[rMove][cMove] == '.' color 要么是 'B' 要么是 'W' 。

来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/ch… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 image.png

解题思路

根据rMove 和 cMove 以及color,从board[rMove][cMove]向8个方向遍历,当出现遍历到空格子的情况,就不是合法的,或者当遍历到出现color的格子,但是线段中间没有别的颜色,那么也不是合法。

代码

class Solution {
    int[][] dir=new int[][]{{1,0},{0,1},{-1,0},{0,-1},{1,1},{-1,-1},{-1,1},{1,-1}};
    public boolean checkMove(char[][] board, int rMove, int cMove, char color) {

        for (int[] d : dir) {
            int x=rMove+d[0],y=cMove+d[1],len=0;
            boolean flag=false;
            while (x>=0&&x<8&&y>=0&&y<8)
            {

                if (board[x][y]=='.')
                {
                    break;
                }
                if (board[x][y]==color)
                {
                    if (len>=1)
                        return true;
                    break;
                }
                x=x+d[0];
                y=y+d[1];
                len++;
            }
        }
        return false;

    }
}