这道题的关键在于对题意的理解,代码本身不难。
自己写的代码是4个方向的递归:易于理解缺点是代码量大。
public int numRookCaptures(char[][] board) {
int x = 0,y = 0;
for (int i = 0; i < 8; i++) {
for (int j = 0; j < 8; j++) {
if ('R' == board[i][j]){
x = i;
y = j;
}
}
}
return dfs1(board,x,y)+
dfs2(board,x,y)+
dfs3(board,x,y)+
dfs4(board,x,y);
}
int count1 = 0;
private int dfs1(char[][] board,int x , int y){
if (x < 0 || y < 0 || x >=8 || y >= 8 || 'B' == board[x][y]){
return 0;
}
if ('p' == board[x][y]){
return 1;
}
count1 += dfs1(board,x + 1,y);
return count1;
}
int count2 = 0;
private int dfs2(char[][] board,int x , int y){
if (x < 0 || y < 0 || x >=8 || y >= 8 || 'B' == board[x][y]){
return 0;
}
if ('p' == board[x][y]){
return 1;
}
count2 += dfs2(board,x - 1,y);
return count2;
}
int count3 = 0;
private int dfs3(char[][] board,int x , int y){
if (x < 0 || y < 0 || x >=8 || y >= 8 || 'B' == board[x][y]){
return 0;
}
if ('p' == board[x][y]){
return 1;
}
count3 += dfs3(board,x,y + 1);
return count3;
}
int count4 = 0;
private int dfs4(char[][] board,int x , int y){
if (x < 0 || y < 0 || x >=8 || y >= 8 || 'B' == board[x][y]){
return 0;
}
if ('p' == board[x][y]){
return 1;
}
count4 += dfs4(board,x,y - 1);
return count4;
}
下面是另一种利用两个数组的4个方向的遍历,很巧妙。
作者:sweetiee
链接:https://leetcode-cn.com/problems/available-captures-for-rook/solution/jian-dan-java100-by-sweetiee/
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;
}