Leetcode周赛5827. 检查操作是否合法
生活随笔
收集整理的這篇文章主要介紹了
Leetcode周赛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 解釋:雖然選中格子涂色后,棋盤上產生了好線段,但選中格子是作為中間格子,沒有產生以選中格子為端點的好線段。?解題代碼
class Solution {public static void main(String[] args) {// write your code here}public boolean checkMove(char[][] board, int rMove, int cMove, char color) {if (color == 'B') {return check(board, rMove, cMove, 'B', 'W');} else {return check(board, rMove, cMove, 'W', 'B');}}public boolean check(char[][] board, int x, int y, char startColor, char midColor) {final char KONG = '.';// 判斷八個方向是否有好線段// 1. 向右if (x <= 5 && board[x + 1][y] == midColor) {for (int i = x + 2; i <= 7; i++) {if (board[i][y] == startColor) {//第一種情況,找到了端點return true;} else if (board[i][y] == KONG) {//第二種情況。發現了空,線段不成。break;}// 第三種情況,找到了中間顏色,繼續向下。}}// 2. 向左if (x >= 2 && board[x - 1][y] == midColor) {for (int i = x - 2; i >= 0; i--) {if (board[i][y] == startColor) {//第一種情況,找到了端點return true;} else if (board[i][y] == KONG) {//第二種情況。發現了空,線段不成。break;}// 第三種情況,找到了中間顏色,繼續向下。}}// 3. 向上if (y >= 2 && board[x][y - 1] == midColor) {for (int i = y - 2; i >= 0; i--) {if (board[x][i] == startColor) {//第一種情況,找到了端點return true;} else if (board[x][i] == KONG) {//第二種情況。發現了空,線段不成。break;}// 第三種情況,找到了中間顏色,繼續向下。}}// 4. 向下if (y <= 5 && board[x][y + 1] == midColor) {for (int i = y + 2; i <= 7; i++) {if (board[x][i] == startColor) {//第一種情況,找到了端點return true;} else if (board[x][i] == KONG) {//第二種情況。發現了空,線段不成。break;}// 第三種情況,找到了中間顏色,繼續向下。}}// 5. 向右下if (y <= 5 && x <= 5 && board[x + 1][y + 1] == midColor) {for (int i = 2; x + i <= 7 && y + i <= 7; i++) {if (board[x + i][y + i] == startColor) {//第一種情況,找到了端點return true;} else if (board[x + i][y + i] == KONG) {//第二種情況。發現了空,線段不成。break;}// 第三種情況,找到了中間顏色,繼續向下。}}// 6. 向左下if (y <= 5 && x >=2 && board[x - 1][y + 1] == midColor) {for (int i = 2; x -i >=0&& y + i <= 7; i++) {if (board[x - i][y + i] == startColor) {//第一種情況,找到了端點return true;} else if (board[x - i][y + i] == KONG) {//第二種情況。發現了空,線段不成。break;}// 第三種情況,找到了中間顏色,繼續向下。}}// 7. 向右上if (y >=2 && x <= 5 && board[x + 1][y - 1] == midColor) {for (int i = 2; x + i <= 7 && y - i >=0; i++) {if (board[x + i][y - i] == startColor) {//第一種情況,找到了端點return true;} else if (board[x + i][y - i] == KONG) {//第二種情況。發現了空,線段不成。break;}// 第三種情況,找到了中間顏色,繼續向下。}}// 8. 向左上if (y >=2 && x >=2 && board[x - 1][y - 1] == midColor) {for (int i = 2; x - i >=0 && y - i >=0; i++) {if (board[x - i][y - i] == startColor) {//第一種情況,找到了端點return true;} else if (board[x - i][y - i] == KONG) {//第二種情況。發現了空,線段不成。break;}// 第三種情況,找到了中間顏色,繼續向下。}}return false;}}總結
以上是生活随笔為你收集整理的Leetcode周赛5827. 检查操作是否合法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Leetcode周赛5193. 删除字符
- 下一篇: Leetcode-5846.周赛 找到数