直接进行挨个遍历,先找到车所在的位置,然后从车的上下左右进行判断,进行统计即可。
package LeetCode.FiveHundredOneToOneThousand;
public class NineHundredAndNightNinetyNine {
public int numRookCaptures(char[][] board) {
// 定义上下左右四个方向
int[] dx = {-1, 1, 0, 0};
int[] dy = {0, 0, -1, 1};
for (int i = 0; i < 8; i++) {
for (int j = 0; j < 8; j++) {
// 找到白车所在的位置
if (board[i][j] == 'R') {
// 分别判断白车的上、下、左、右四个方向
int res = 0;
for (int k = 0; k < 4; k++) {
int x = i, y = j;
while (true) {
x += dx[k];
y += dy[k];
if (x < 0 || x >= 8 || y < 0 || y >= 8 || board[x][y] == 'B') {
break;
}
if (board[x][y] == 'p') {
res++;
break;
}
}
}
return res;
}
}
}
return 0;
}
}
我自己第一次的错误思想:
我没有考虑车不能斜着走,直接让他们进行遍历,所以就计算错误了。
class Solution {
public int numRookCaptures(char[][] board) {
//先遍历找到车(R)
int [] rc = findR(board);
if (rc[0] == -1) return 0;
int sum = 0;
//在R周围开始遍历,如果遇到B就停止,遇到p就计数
for (int i = rc[0]; i < 8; i++){
char[] temp = board[i];
for (int j =rc[1]; j < 8; j++ ) {
if (temp[j] == 'B') break;
if (temp[j] == 'p') {
sum++;
break;
}
}
for (int k = rc[1]; k >= 0; k--) {
if (temp[k] == 'B') break;
if (temp[k] == 'p'){
sum++;
break;
}
}
}
for (int i = rc[0]; i >= 0; i--){
char[] temp = board[i];
for (int j =rc[1]; j < 8; j++ ) {
if (temp[j] == 'B') break;
if (temp[j] == 'p') sum++;
}
for (int k = rc[1]; k >= 0; k--) {
if (temp[k] == 'B') break;
if (temp[k] == 'p') sum++;
}
}
return sum;
}
private int [] findR(char [][] board){
int[] rc = {-1, -1};
for (int i = 0; i < 8; i++)
for (int j = 0; j < 8; j++)
if (board[i][j] == 'R'){
rc[0] = i;
rc[1] = j;
return rc;
}
return rc;
}
}