生活随笔
收集整理的這篇文章主要介紹了
LeetCode 1958. 检查操作是否合法(模拟)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
1. 題目
給你一個下標從 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)
鏈接:https://leetcode-cn.com/problems/check-if-move-is-legal
著作權歸領扣網絡所有。商業轉載請聯系官方授權,非商業轉載請注明出處。
2. 解題
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阿明),一起加油、一起學習進步!
總結
以上是生活随笔為你收集整理的LeetCode 1958. 检查操作是否合法(模拟)的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。