-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy path0999. Available Captures for Rook
More file actions
198 lines (167 loc) · 5.94 KB
/
0999. Available Captures for Rook
File metadata and controls
198 lines (167 loc) · 5.94 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
/****************************************
999. Available Captures for Rook
Mode: Easy
On an 8 x 8 chessboard, there is one white rook.
There also may be empty squares, white bishops, and black pawns.
These are given as characters 'R', '.', 'B', and 'p' respectively.
Uppercase characters represent white pieces, and lowercase characters represent black pieces.
The rook moves as in the rules of Chess:
it chooses one of four cardinal directions (north, east, west, and south),
then moves in that direction until it chooses to stop, reaches the edge of the board,
or captures an opposite colored pawn by moving to the same square it occupies.
Also, rooks cannot move into the same square as other friendly bishops.
Return the number of pawns the rook can capture in one move.
Example 1:
Input:
[[".",".",".",".",".",".",".","."]
,[".",".",".","p",".",".",".","."]
,[".",".",".","R",".",".",".","p"]
,[".",".",".",".",".",".",".","."]
,[".",".",".",".",".",".",".","."]
,[".",".",".","p",".",".",".","."]
,[".",".",".",".",".",".",".","."]
,[".",".",".",".",".",".",".","."]]
Output: 3
Explanation:
In this example the rook is able to capture all the pawns.
Example 2:
Input:
[[".",".",".",".",".",".",".","."]
,[".","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",".","."]
,[".",".",".",".",".",".",".","."]
,[".",".",".",".",".",".",".","."]]
Output: 0
Explanation:
Bishops are blocking the rook to capture any pawn.
Example 3:
Input:
[[".",".",".",".",".",".",".","."]
,[".",".",".","p",".",".",".","."]
,[".",".",".","p",".",".",".","."]
,["p","p",".","R",".","p","B","."]
,[".",".",".",".",".",".",".","."]
,[".",".",".","B",".",".",".","."]
,[".",".",".","p",".",".",".","."]
,[".",".",".",".",".",".",".","."]]
Output: 3
Explanation:
The rook can capture the pawns at positions b5, d6 and f5.
Note:
board.length == board[i].length == 8
board[i][j] is either 'R', '.', 'B', or 'p'
There is exactly one cell with board[i][j] == 'R'
****************************************/
/****************************************
解题思路:
题目问从'R'点开始上下左右直走,碰到'B','p',或者边界则停止,可能遇到多少个'p'。
我们用result记录可能遇到的p的数量,遍历整个board。
当遇到'R'时,我们尝试从'R'的位置开始,向四个方向移动:
1) 当遇到边界,则停止当前方向探索;
2) 当遇到'B'时,则停止当前方向探索;
3) 当遇到'p'时,result++,并停止当前方向探索;
4) 当四个方向均探索完毕,则可以直接返回count_p。
如果遍历board结束仍没有返回,则说明不存在'R',可返回0。
****************************************/
/***************************************** Solution_01 ****************************************/
class Solution {
public int numRookCaptures(char[][] board) {
int row = board.length;
int col = board[0].length;
int result = 0;
int r = 0;
int c = 0;
for (int i = 0; i < row; i ++) {
for (int j = 0; j < col; j ++) {
if (board[i][j] == 'R') {
r = i;
c = j;
break;
}
}
}
for (int i = r+1; i < row; i ++) {
if (board[i][c] == 'B') {break;}
else if (board[i][c] == 'p') {
result ++;
break;
}
}
for (int i = r-1; i >= 0; i --) {
if (board[i][c] == 'B') {break;}
else if (board[i][c] == 'p') {
result ++;
break;
}
}
for (int i = c+1; i < col; i ++) {
if (board[r][i] == 'B') {break;}
else if (board[r][i] == 'p') {
result ++;
break;
}
}
for (int i = c-1; i >= 0; i --) {
if (board[r][i] == 'B') {break;}
else if (board[r][i] == 'p') {
result ++;
break;
}
}
return result;
}
}
/**************************************** Solution_02 ****************************************/
class Solution {
public int numRookCaptures(char[][] board) {
for (int i = 0; i < board.length; ++i) {
for (int j = 0; j < board[i].length; ++j) {
if (board[i][j] == 'R')
return cap(board,i,j,0,1)+cap(board,i,j,0,-1)+cap(board,i,j,1,0)+cap(board,i,j,-1,0);
}
}
return 0;
}
private int cap(char[][] board, int x, int y, int r, int c) {
while (x >= 0 && x < board.length
&& y >= 0 && y < board[x].length
&& board[x][y] != 'B') {
if (board[x][y] == 'p') {return 1;}
x += r; y += c;
}
return 0;
}
}
/**************************************** Solution_03 ****************************************/
class Solution {
public int numRookCaptures(char[][] board) {
int[] point = new int[2];
int row = board.length;
int col = board[0].length;
for(int i = 0 ; i < row ; i++) {
for(int j = 0 ; j < col ; j++) {
if(board[i][j] == 'R') {
point[0] = i;
point[1] = j;
break;
}
}
}
int result = 0;
int[][] dirs = {{1,0},{-1,0},{0,1},{0,-1}};
for(int[] dir : dirs) {
int x = point[0] + dir[0];
int y = point[1] + dir[1];
while(x >= 0 && y >= 0 && x < row && y < col && board[x][y] == '.') {
x += dir[0];
y += dir[1];
}
if(x < 0 || y < 0 || x >= row || y >= col) continue;
if(board[x][y] == 'p') {result++;}
}
return result;
}
}