Leetcode周赛5827. 检查操作是否合法
題目描述
給你一個(gè)下標(biāo)從?0?開(kāi)始的?8 x 8?網(wǎng)格?board?,其中?board[r][c]?表示游戲棋盤(pán)上的格子?(r, c)?。棋盤(pán)上空格用?'.'?表示,白色格子用?'W'?表示,黑色格子用?'B'?表示。
游戲中每次操作步驟為:選擇一個(gè)空格子,將它變成你正在執(zhí)行的顏色(要么白色,要么黑色)。但是,合法?操作必須滿(mǎn)足:涂色后這個(gè)格子是?好線(xiàn)段的一個(gè)端點(diǎn)?(好線(xiàn)段可以是水平的,豎直的或者是對(duì)角線(xiàn))。
好線(xiàn)段?指的是一個(gè)包含?三個(gè)或者更多格子(包含端點(diǎn)格子)的線(xiàn)段,線(xiàn)段兩個(gè)端點(diǎn)格子為?同一種顏色?,且中間剩余格子的顏色都為?另一種顏色?(線(xiàn)段上不能有任何空格子)。你可以在下圖找到好線(xiàn)段的例子:
給你兩個(gè)整數(shù)?rMove?和?cMove?以及一個(gè)字符?color?,表示你正在執(zhí)行操作的顏色(白或者黑),如果將格子?(rMove, cMove)?變成顏色?color?后,是一個(gè)?合法?操作,那么返回?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' 分別用顏色藍(lán)色,白色和黑色表示。格子 (rMove, cMove) 用 'X' 標(biāo)記。 以選中格子為端點(diǎn)的兩個(gè)好線(xiàn)段在上圖中用紅色矩形標(biāo)注出來(lái)了。示例 2:
輸入:board = [[".",".",".",".",".",".",".","."],[".","B",".",".","W",".",".","."],[".",".","W",".",".",".",".","."],[".",".",".","W","B",".",".","."],[".",".",".",".",".",".",".","."],[".",".",".",".","B","W",".","."],[".",".",".",".",".",".","W","."],[".",".",".",".",".",".",".","B"]], rMove = 4, cMove = 4, color = "W" 輸出:false 解釋:雖然選中格子涂色后,棋盤(pán)上產(chǎn)生了好線(xiàn)段,但選中格子是作為中間格子,沒(méi)有產(chǎn)生以選中格子為端點(diǎn)的好線(xiàn)段。?解題代碼
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 = '.';// 判斷八個(gè)方向是否有好線(xiàn)段// 1. 向右if (x <= 5 && board[x + 1][y] == midColor) {for (int i = x + 2; i <= 7; i++) {if (board[i][y] == startColor) {//第一種情況,找到了端點(diǎn)return true;} else if (board[i][y] == KONG) {//第二種情況。發(fā)現(xiàn)了空,線(xiàn)段不成。break;}// 第三種情況,找到了中間顏色,繼續(xù)向下。}}// 2. 向左if (x >= 2 && board[x - 1][y] == midColor) {for (int i = x - 2; i >= 0; i--) {if (board[i][y] == startColor) {//第一種情況,找到了端點(diǎn)return true;} else if (board[i][y] == KONG) {//第二種情況。發(fā)現(xiàn)了空,線(xiàn)段不成。break;}// 第三種情況,找到了中間顏色,繼續(xù)向下。}}// 3. 向上if (y >= 2 && board[x][y - 1] == midColor) {for (int i = y - 2; i >= 0; i--) {if (board[x][i] == startColor) {//第一種情況,找到了端點(diǎn)return true;} else if (board[x][i] == KONG) {//第二種情況。發(fā)現(xiàn)了空,線(xiàn)段不成。break;}// 第三種情況,找到了中間顏色,繼續(xù)向下。}}// 4. 向下if (y <= 5 && board[x][y + 1] == midColor) {for (int i = y + 2; i <= 7; i++) {if (board[x][i] == startColor) {//第一種情況,找到了端點(diǎn)return true;} else if (board[x][i] == KONG) {//第二種情況。發(fā)現(xiàn)了空,線(xiàn)段不成。break;}// 第三種情況,找到了中間顏色,繼續(xù)向下。}}// 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) {//第一種情況,找到了端點(diǎn)return true;} else if (board[x + i][y + i] == KONG) {//第二種情況。發(fā)現(xiàn)了空,線(xiàn)段不成。break;}// 第三種情況,找到了中間顏色,繼續(xù)向下。}}// 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) {//第一種情況,找到了端點(diǎn)return true;} else if (board[x - i][y + i] == KONG) {//第二種情況。發(fā)現(xiàn)了空,線(xiàn)段不成。break;}// 第三種情況,找到了中間顏色,繼續(xù)向下。}}// 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) {//第一種情況,找到了端點(diǎn)return true;} else if (board[x + i][y - i] == KONG) {//第二種情況。發(fā)現(xiàn)了空,線(xiàn)段不成。break;}// 第三種情況,找到了中間顏色,繼續(xù)向下。}}// 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) {//第一種情況,找到了端點(diǎn)return true;} else if (board[x - i][y - i] == KONG) {//第二種情況。發(fā)現(xiàn)了空,線(xiàn)段不成。break;}// 第三種情況,找到了中間顏色,繼續(xù)向下。}}return false;}}總結(jié)
以上是生活随笔為你收集整理的Leetcode周赛5827. 检查操作是否合法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Leetcode周赛5193. 删除字符
- 下一篇: Leetcode-5846.周赛 找到数