1. 题目
2.题解
8个方向DFS,注意几点:
仅有两种颜色的棋子, 非黑即白
越界返回
空格子返回
两个端点直接相连返回
class Solution {
//八个方向模拟
private int[][] dirs = new int[][]{{1, 0}, {-1, 0}, {0, 1}, {0, -1}, {-1, -1}, {-1, 1}, {1, -1}, {1, 1}};
public boolean checkMove(char[][] board, int rMove, int cMove, char color) {
for (int[] dir : dirs) {
int r = rMove, c = cMove;
boolean flag = false;
while (true) {
r += dir[0];
c += dir[1];
if (r < 0 || r >= 8 || c < 0 || c >= 8) //越界break
break;
if (board[r][c] == '.') //空格子break
break;
if (board[r][c] == color) { //如果两个连着的color,直接break。 flag控制相同的端点不连在一起
if (flag) {
return true;
}
break;
}
flag = true;
}
}
return false;
}
}
这样写也一样:
class Solution {
public boolean checkMove(char[][] board, int rMove, int cMove, char color) {
int[][] dirs = new int[][] {{0, -1}, {0, 1}, {-1, 0}, {1, 0}, {-1, -1}, {1, 1}, {-1, 1}, {1, -1}};
for (int[] dir : dirs) {
int x = dir[0], y = dir[1];
int r = rMove + x, c = cMove + y, count = 0;
while (isValid(r, c)) {
// exit
if (count >= 1 && board[r][c] == color)
return true; //如果两个连着的color,直接break。 flag控制相同的端点不连在一起
if (board[r][c] == '.')
break;
if (count == 0 && board[r][c] == color)
break;
// dfs
count++; //如果两个连着的color,直接break。 count控制相同的端点不连在一起
r += x;
c += y;
}
}
return false;
}
private boolean isValid(int r, int c) {
return 0 <= r && r < 8 && 0 <= c && c < 8;
}
}