Leetcode_999_车的可用捕获量(Java_Coding 复杂——>简化)

题目描述

题目来源于力扣


解:
先梳理题意:
 其实就是“车”上下左右跑,遇到“象(B)”、吃一个“兵(p)”、“碰壁”就停止;其他情况就走就行了。然后统计能吃多少个兵。
三停:

  • B 直接停止
  • p 计数,然后停止
  • 碰壁 直接停止

那么直接按照上下左右四个循环就解决了。
Code:

package Array;

public class numRookCaptures999车的可用捕获量 {
    public static int numRookCaptures(char[][] board) {
    	int n = board.length;
    	int x = 0;
    	int y = 0;
    	//找到R
    	for(int i=0;i<n;i++) {
    		for(int j=0;j<n;j++) {
    			if(board[i][j]=='R') {
    				x = i;
    				y = j;
    			}
    		}
    	}
    	int count = 0;
    	//上下用i控制
    	//上
    		//三种可能性:遇到'B'停止;遇到'p'停止,count++;遇到'.'停止 循环结束停止
    	for(int i=x;i>0;i--) {
    		if(board[i-1][y]=='B') {
    			break;
    		}else if(board[i-1][y]=='p') {
    			count++;
    			break;
    		}else if (board[i-1][y]=='.') {
    			break;
    		}
    	}
    	//下
    	for(int i=x;i<n;i++) {
    		if(board[i+1][y]=='B') {
    			break;
    		}else if(board[i+1][y]=='p') {
    			count++;
    			break;
    		}else if (board[i+1][y]=='.') {
    			break;
    		}
    	}
    	//左右用j控制
    	//左
    	for(int j=y;j>0;j--) {
    		if(board[x][j-1]=='B') {
    			break;
    		}else if(board[x][j-1]=='p') {
    			count++;
    			break;
    		}else if (board[x][j-1]=='.') {
    			break;
    		}
    	}
    	//右
    	for(int j=y;j<n;j++) {
    		if(board[x][j+1]=='B') {
    			break;
    		}else if(board[x][j+1]=='p') {
    			count++;
    			break;
    		}else if (board[x][j+1]=='.') {
    			break;
    		}
    	}
    	return count;
    }
}

可能看到这四个循环有点想吐,哈哈。那么既然四个循环都差不多,那么可以整合一下。
现在知道,这个车只能上下左右跑,假设现在坐标为(x , y)。

  • 向上:(x - 1 , y);
  • 向下:(x + 1, y);
  • 向左:(x , y - 1);
  • 向右:(x , y + 1);
    对于x、y分别是(-1,0) (1,0)(0,-1)(0,1),一对代表一个方向。
package Array;

public class numRookCaptures999车的可用捕获量优化方式 {
    public static int numRookCaptures(char[][] board) {
    	int n = board.length;
    	int x = 0;
    	int y = 0;
    	//找到R
    	for(int i=0;i<n;i++) {
    		for(int j=0;j<n;j++) {
    			if(board[i][j]=='R') {
    				x = i;
    				y = j;
    			}
    		}
    	}
    	int count = 0;
    	int[] dx = {-1,1,0,0};//每一对就是上、下、左、右
    	int[] dy = {0,0,-1,1};
    	for(int i=0;i<4;i++) {
    		int curX = x;
    		int curY = y;
    		//选一条路,然后走到黑
    		while(curX > 0 && curX < n-1 && curY > 0 && curY < n-1) {//碰壁条件
    			curX += dx[i];
    			curY += dy[i];
    			if(board[curX][curY]=='B') {
    				break;
    			}else if (board[curX][curY]=='p') {
    				count++;
    				break;
    			}
    		}
    	}
    	return count;
    }
}

想起了孙燕姿的《遇见》,向左 向右 向前看😂😂😂

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值