1、二维网格迁移
//给你一个 m 行 n 列的二维网格 grid 和一个整数 k。你需要将 grid 迁移 k 次。 // // 每次「迁移」操作将会引发下述活动: // // // 位于 grid[i][j] 的元素将会移动到 grid[i][j + 1]。 // 位于 grid[i][n - 1] 的元素将会移动到 grid[i + 1][0]。 // 位于 grid[m - 1][n - 1] 的元素将会移动到 grid[0][0]。 // // // 请你返回 k 次迁移操作后最终得到的 二维网格。 // // // // 示例 1: // // // // //输入:grid = [[1,2,3],[4,5,6],[7,8,9]], k = 1 //输出:[[9,1,2],[3,4,5],[6,7,8]] // // // 示例 2: // // // // //输入:grid = [[3,8,1,9],[19,7,2,5],[4,6,11,10],[12,0,21,13]], k = 4 //输出:[[12,0,21,13],[3,8,1,9],[19,7,2,5],[4,6,11,10]] // // // 示例 3: // // //输入:grid = [[1,2,3],[4,5,6],[7,8,9]], k = 9 //输出:[[1,2,3],[4,5,6],[7,8,9]] // // // // // 提示: // // // m == grid.length // n == grid[i].length // 1 <= m <= 50 // 1 <= n <= 50 // -1000 <= grid[i][j] <= 1000 // 0 <= k <= 100 // // Related Topics 数组
直接模拟迁移,一个个往后移动,一共移动k次
public List<List<Integer>> shiftGrid(int[][] grid, int k) {
// Repeat the transform k times.
for (;k > 0; k--) {
int previous = grid[grid.length - 1][grid[0].length - 1];
for (int row = 0; row < grid.length; row++) {
for (int col = 0; col < grid[0].length; col++) {
int temp = grid[row][col];
grid[row][col] = previous;
previous = temp;
}
}
}
// Copy the grid into a list for returning.
List<List<Integer>> result = new ArrayList<>();
for (int[] row : grid) {
List<Integer> listRow = new ArrayList<>();
result.add(listRow);
for (int v : row) listRow.add(v);
}
return result;
}
2、找出井字棋的获胜者
//A 和 B 在一个 3 x 3 的网格上玩井字棋。 // // 井字棋游戏的规则如下: // // // 玩家轮流将棋子放在空方格 (" ") 上。 // 第一个玩家 A 总是用 "X" 作为棋子,而第二个玩家 B 总是用 "O" 作为棋子。 // "X" 和 "O" 只能放在空方格中,而不能放在已经被占用的方格上。 // 只要有 3 个相同的(非空)棋子排成一条直线(行、列、对角线)时,游戏结束。 // 如果所有方块都放满棋子(不为空),游戏也会结束。 // 游戏结束后,棋子无法再进行任何移动。 // // // 给你一个数组 moves,其中每个元素是大小为 2 的另一个数组(元素分别对应网格的行和列),它按照 A 和 B 的行动顺序(先 A 后 B)记录了两人各 //自的棋子位置。 // // 如果游戏存在获胜者(A 或 B),就返回该游戏的获胜者;如果游戏以平局结束,则返回 "Draw";如果仍会有行动(游戏未结束),则返回 "Pending" //。 // // 你可以假设 moves 都 有效(遵循井字棋规则),网格最初是空的,A 将先行动。 // // // // 示例 1: // // 输入:moves = [[0,0],[2,0],[1,1],[2,1],[2,2]] //输出:"A" //解释:"A" 获胜,他总是先走。 //"X " "X " "X " "X " "X " //" " -> " " -> " X " -> " X " -> " X " //" " "O " "O " "OO " "OOX" // // // 示例 2: // // 输入:moves = [[0,0],[1,1],[0,1],[0,2],[1,0],[2,0]] //输出:"B" //解释:"B" 获胜。 //"X " "X " "XX " "XXO" "XXO" "XXO" //" " -> " O " -> " O " -> " O " -> "XO " -> "XO " //" " " " " " " " " " "O " // // // 示例 3: // // 输入:moves = [[0,0],[1,1],[2,0],[1,0],[1,2],[2,1],[0,1],[0,2],[2,2]] //输出:"Draw" //输出:由于没有办法再行动,游戏以平局结束。 //"XXO" //"OOX" //"XOX" // // // 示例 4: // // 输入:moves = [[0,0],[1,1]] //输出:"Pending" //解释:游戏还没有结束。 //"X " //" O " //" " // // // // // 提示: // // // 1 <= moves.length <= 9 // moves[i].length == 2 // 0 <= moves[i][j] <= 2 // moves 里没有重复的元素。 // moves 遵循井字棋的规则。 // // Related Topics 数组
直接看看有没有三个一行,三个一列或者三个都在对角线上的情况。
public String tictactoe(int[][] moves) {
int m = moves.length;
int[] count = new int[8];
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]++;
//对副对角线的影响
if (moves[i][0] + moves[i][1] == 2)
count[7]++;
if (count[moves[i][0]] == 3 || count[moves[i][1] + 3] == 3 ||
count[6] == 3 || count[7] == 3) {
return m % 2 == 0 ? "B" : "A";
}
}
if (moves.length < 9) {
return "Pending";
}
return "Draw";
}