思路:
- 虽然有A、B、Pending、Draw四种答案的可能。我们首先判断A、B谁能赢,再讨论A、B都未胜的情况下游戏是结束了还是继续进行;
- 判断A、B是否有人能取胜,只需要判断最后一个落棋的人是否能胜;(因为要是另外一个人赢了,游戏就结束了,不再有继续下棋的机会)
- 用数组记录最后落棋者的走棋情况,如果等于三,游戏结束,此人胜利;(以3x3为例,其余可以类推)
- 最后落棋者为未胜时,棋盘被下满则Draw,棋盘未下满则Pending。
public String tictactoe(int[][] moves) {
int m = moves.length;
// 用数组记录0-2行、0-2列、正对角线、副对角线是否已满3个棋子
// count[0-2]对应0-2行、count[3-5]对应0-2列、count[6]对应正对角线、count[7]对应副对角线
int[] count = new int[8];
// 思路第2步已解释为何只需考虑最后一个落棋的人
// 倒序统计此人走棋情况
for(int i = m - 1; i >= 0; i -= 2) {
// 此棋对行的影响
count[moves[i][0]]++;
// 此棋对列的影响
count[moves[i][1] + 3]++;
// 此棋对正对角线的影响
if(moves[i][0] == moves[i][1])
count[6]++;
// 此棋对副对角线的影响 (
// 此处为3x3的情况,其余大小的棋盘可以类推
if(moves[i][0] + moves[i][1] == 2)
count[7]++;
// 满3个棋子则胜利
if(count[moves[i][0]] == 3 || count[moves[i][1] + 3] == 3 ||
count[6] == 3 || count[7] == 3)
// A先B后 则总长度为偶时 最后为B 反之为A
return m % 2 == 0 ? "B" : "A";
}
// 未胜时,棋盘未下满则继续
if(moves.length < 9)
return "Pending";
// 未胜时,棋盘下满则平局结束
return "Draw";
}