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;
}