题目描述
解:
先梳理题意:
其实就是“车”上下左右跑,遇到“象(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;
}
}
想起了孙燕姿的《遇见》,向左 向右 向前看😂😂😂