-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathAvailableCapturesForRook.java
More file actions
122 lines (117 loc) · 5.21 KB
/
AvailableCapturesForRook.java
File metadata and controls
122 lines (117 loc) · 5.21 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
package array;
/**
* @author :DengSiYuan
* @date :2019/9/13 22:12
* @desc : 999.车的可用捕获量
* 【题目】
* 在一个 board.length x board.length 的棋盘上,有一个白色车(rook)。也可能有空方块,白色的象(bishop)和黑色的卒(pawn)。它们分别以字符 “R”,“.”,“B” 和 “p” 给出。大写字符表示白棋,小写字符表示黑棋。
*
* 车按国际象棋中的规则移动:它选择四个基本方向中的一个(北,东,西和南),然后朝那个方向移动,直到它选择停止、到达棋盘的边缘或移动到同一方格来捕获该方格上颜色相反的卒。另外,车不能与其他友方(白色)象进入同一个方格。
*
* 返回车能够在一次移动中捕获到的卒的数量。
* 【示例】
* 
* 输入:[[".",".",".",".",".",".",".","."],[".",".",".","p",".",".",".","."],[".",".",".","R",".",".",".","p"],[".",".",".",".",".",".",".","."],[".",".",".",".",".",".",".","."],[".",".",".","p",".",".",".","."],[".",".",".",".",".",".",".","."],[".",".",".",".",".",".",".","."]]
* 输出:3
* 解释:
* 在本例中,车能够捕获所有的卒。
*/
public class AvailableCapturesForRook {
/**
* 【个人思路】
* 先找到军所在的位置,然后在控制分别控制x轴、y轴不变进行遍历寻找卒和象。
* (1)遇到第一个卒就进行++并跳出本次循环并进行下一次循环
* (2)遇到象就跳出本次循环进行下一次循环
* @param board
* @return
*/
public int numRookCaptures(char[][] board) {
int result = 0;
for (int i = 0; i < board.length; i++) {
for (int j = 0; j < board.length; j++) {
if(board[i][j] == 'R') {
for (int k = j - 1; k >= 0; k--) {
if (board[i][k] == 'B') {break;}
if (board[i][k] == 'p') {
result++;
break;
}
}
for (int k = j + 1; k < board.length; k++) {
if (board[i][k] == 'B') {break;}
if (board[i][k] == 'p') {
result++;
break;
}
}
for (int k = i - 1; k >= 0; k--) {
if (board[k][j] == 'B') {break;}
if (board[k][j] == 'p') {
result++;
break;
}
}
for (int k = i + 1; k < board.length; k++) {
if (board[k][j] == 'B') {break;}
if (board[k][j] == 'p') {
result++;
break;
}
}
break;
}
}
}
return result;
}
/**
* 【LeetCode 解法】
* 【想法】
* (1)找到军所在的索引位置,以该索引为原点建立平面直角坐标系
* (2)从该坐标分别向上下左右寻找满足要求的元素
* @param board
* @return
*/
public int numRookCaptures1(char[][] board) {
for(int i=0;i<board.length;i++){
for(int j=0;j<board[i].length;j++){
//找到R的位置
if(board[i][j]=='R'){
//以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;
}
public int cap(char[][] a,int x,int y,int dx,int dy){
/*参数说明
*a为原数组矩阵
*x,y为R的坐标
*dx,dy为增长步长
*/
while(x>=0 && x<a.length && y>=0 && y<a[x].length && a[x][y]!='B'){
if(a[x][y]=='p'){
return 1;
}
x+=dx;
y+=dy;
}
return 0;
}
public static void main(String[] args) {
AvailableCapturesForRook rook = new AvailableCapturesForRook();
char[][] arr = new char[][]{{'.','.','.','.','.','.','.','.'},{'.','.','.','p','.','.','.','.'},{'.','.','.','R','.','.','.','p'},{'.','.','.','.','.','.','.','.'},{'.','.','.','.','.','.','.','.'},{'.','.','.','p','.','.','.','.'},{'.','.','.','.','.','.','.','.'},{'.','.','.','.','.','.','.','.'}};
long start = System.nanoTime();
int result = rook.numRookCaptures(arr);
long end = System.nanoTime();
System.out.println("吃掉:" + result + "个");
System.out.println("运行时间:" + (end - start) / 1000000.0 + "ms");
start = System.nanoTime();
result = rook.numRookCaptures1(arr);
end = System.nanoTime();
System.out.println("吃掉:" + result + "个");
System.out.println("运行时间:" + (end - start) / 1000000.0 + "ms");
}
}