LeetCode999. 车的可用捕获量 [简单]——每日一题系列

题目描述:

在一个 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;
    }
};

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值