Leetcode 999:车的可用捕获量

题目描述

在一个8X8的棋盘上,有一个白色车(rook)。也可能有空方快,白色的象(bishop)和黑色卒(pawn)。它们分别以字符"R",".","B"和"p"给出。大写字符表示白棋,小写字符表示黑棋。

车按国际象棋中的规则移动:它选择四个基本方向的一个(北,东,西和南),然后朝那个方向移动,直到它选择停止、到达棋盘的边缘或移动到同一个方格来捕获该方格上颜色相反的卒。另外,车不能与其他友方(白色)象进入同一个方格。

返回车能够在一次移动中捕获到的卒的数量。

示例1

解题思路

本题只涉及四个方向的直线移动,比经典的迷宫dfs、bfs要简单。

bool judge(vector<vector<char>>& board,int x,int y){
        return x<0 || x>=8 || y<0 || y>=8 || board[x][y] == 'B';
    }
    int numRookCaptures(vector<vector<char>>& board) {
        int rx,ry,sum;
        sum = 0;
        rx = ry = -1;
        for(int i=0;i<board.size();i++){
            for(int j=0;j<board[0].size();j++) if(board[i][j] == 'R'){
                rx = i;ry = j;
                break;
            }
            if(rx > -1) break;
        }
        int X[] = {0,1,0,-1};
        int Y[] = {-1,0,1,0};
        int mx,my,i;
        mx = rx;my = ry;i = 0;
        while(i<4){
            mx += X[i];
            my += Y[i];
            if(judge(board,mx,my)){
                mx = rx;my = ry;
                i++;
            }else{
                if(board[mx][my] == 'p'){
                    mx = rx;my = ry;
                    i++;
                    sum++;
                }
            }
        }
        return sum;
    }

猜你喜欢

转载自blog.csdn.net/weixin_35338624/article/details/87950772