前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >LeetCode 1958. 检查操作是否合法(模拟)

LeetCode 1958. 检查操作是否合法(模拟)

作者头像
Michael阿明
发布2021-09-06 11:25:32
4840
发布2021-09-06 11:25:32
举报
文章被收录于专栏:Michael阿明学习之路

文章目录

1. 题目

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

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

好线段 指的是一个包含 三个或者更多格子(包含端点格子)的线段,线段两个端点格子为 同一种颜色 ,且中间剩余格子的颜色都为 另一种颜色 (线段上不能有任何空格子)。

你可以在下图找到好线段的例子:

在这里插入图片描述
在这里插入图片描述

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

示例 1:

在这里插入图片描述
在这里插入图片描述
代码语言:javascript
复制
输入: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:

在这里插入图片描述
在这里插入图片描述
代码语言:javascript
复制
输入: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) 链接:https://leetcode-cn.com/problems/check-if-move-is-legal 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 解题

  • 八个方向,依次检查,存在一个满足即可
代码语言:javascript
复制
class Solution {
public:
    bool checkMove(vector<vector<char>>& board, int rMove, int cMove, char color) {
        vector<vector<int>> dir = {{1,0},{0,1},{-1,0},{0,-1},{1,1},{1,-1},{-1,1},{-1,-1}};
        for(int i = 0; i < 8; ++i)
        {
            bool revColor = false;
            int x = rMove, y = cMove;
            while(inside(x+dir[i][0], y+dir[i][1]))
            {
                if(board[x+dir[i][0]][y+dir[i][1]]=='.') // 遇到空格
                {
                    break;
                }
                if(board[x+dir[i][0]][y+dir[i][1]] != color) //与起点相反的颜色
                    revColor = true;
                else  // 起点相同的颜色
                {
                    if (revColor == true)
                        return true;
                    break;
                }
                x += dir[i][0];
                y += dir[i][1];
            }
        }
        return false;
    }
    bool inside(int x, int y)
    {
        return x>=0 && x<8 && y>=0 && y<8;
    }
};

4 ms 10.9 MB C++


我的CSDN博客地址 https://michael.blog.csdn.net/

长按或扫码关注我的公众号(Michael阿明),一起加油、一起学习进步!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/08/08 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 1. 题目
  • 2. 解题
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档