题目描述:
在一个 8 x 8 的棋盘上,有一个白色车(rook)。也可能有空方块,白色的象(bishop)和黑色的卒(pawn)。它们分别以字符 “R”,“.”,“B” 和 “p” 给出。大写字符表示白棋,小写字符表示黑棋。
车按国际象棋中的规则移动:它选择四个基本方向中的一个(北,东,西和南),然后朝那个方向移动,直到它选择停止、到达棋盘的边缘或移动到同一方格来捕获该方格上颜色相反的卒。另外,车不能与其他友方(白色)象进入同一个方格。
返回车能够在一次移动中捕获到的卒的数量。
输入:[[".",".",".",".",".",".",".","."],[".",".",".","p",".",".",".","."],[".",".",".","R",".",".",".","p"],
[".",".",".",".",".",".",".","."],[".",".",".",".",".",".",".","."],[".",".",".","p",".",".",".","."],
[".",".",".",".",".",".",".","."],[".",".",".",".",".",".",".","."]]
输出:3
解释:
在本例中,车能够捕获所有的卒
输入:[[".",".",".",".",".",".",".","."],[".","p","p","p","p","p",".","."],[".","p","p","B","p","p",".","."],
[".","p","B","R","B","p",".","."],[".","p","p","B","p","p",".","."],[".","p","p","p","p","p",".","."],
[".",".",".",".",".",".",".","."],[".",".",".",".",".",".",".","."]]
输出:0
解释:
象阻止了车捕获任何卒。
我的解题:
1.小白菜第一反应,求出车的坐标,四个for循环。。。
class Solution {
public:
int numRookCaptures(vector<vector<char>>& board) {
int num=0;
int flag=0;
int i,j;
for( i=0;i<8;i++){
if(count(board[i].begin(),board[i].end(),'R')){
for( j=0;j<8;j++){
if(board[i][j]=='R'){
flag=1;
break;
}
}
}
if(flag)break;
}
if(!flag) return 0;
for(int m=i-1,n=j;m>=0;m--){//北
if(board[m][n]=='B') break;
if(board[m][n]=='p'){ num++; break; }
else continue;
}
for(int m=i+1,n=j;m<8;m++){//南
if(board[m][n]=='B') break;
if(board[m][n]=='p'){ num++; break; }
else continue;
}
for(int m=i,n=j+1;n<8;n++){//东
if(board[m][n]=='B') break;
if(board[m][n]=='p'){ num++; break; }
else continue;
}
for(int m=i,n=j-1;n>=0;n--){//西
if(board[m][n]=='B') break;
if(board[m][n]=='p'){ num++; break; }
else continue;
}
return num;
}
};
2. 使用方向数组代表移动的方向,四个for循环合一,这个快了好多
class Solution {
public:
int numRookCaptures(vector<vector<char>>& board) {
int num=0;
int i,j;
int flag=0;
for( i=0;i<8;i++){
if(count(board[i].begin(),board[i].end(),'R')){
for( j=0;j<8;j++){
if(board[i][j]=='R'){
flag=1;
break;
}
}
}
if(flag) break;
}//求得车的坐标
int x[]={-1,1,0,0};
int y[]={0,0,1,-1};
for(int p=0;p<4;p++){
int m=i,n=j;
m+=x[p];
n+=y[p];
while(m>=0 && m<8 && n>=0 && n<8){
if(board[m][n]=='B') break;
else if(board[m][n]=='.'){ m+=x[p];n+=y[p];}
else {num++;break;}
}
}
return num;
}
};