package LeetCode_348 /** * 348. Design Tic-Tac-Toe * (Lock by leetcode) * https://www.lintcode.com/problem/design-tic-tac-toe/description * Design a Tic-tac-toe game that is played between two players on a n x n grid. You may assume the following rules: 1. A move is guaranteed to be valid and is placed on an empty block. 2. Once a winning condition is reached, no more moves is allowed. 3. A player who succeeds in placing n of their marks in a horizontal, vertical, or diagonal row wins the game. * */ class Solution { var matrix: Array<IntArray>? = null var rows: IntArray? = null var cols: IntArray? = null var dia1 = 0 var dia2 = 0 var n = 0 fun TicTacToe(n: Int) { this.n = n matrix = Array(n, { IntArray(n) }) rows = IntArray(n) cols = IntArray(n) } fun move2(row: Int, col: Int, player: Int): Int { val value = if (player == 1) 1 else -1 rows!![row] += value cols!![col] += value //diagonal from top left to right bottom if (row == col) { dia1++ } //diagonal from top right to left bottom if (col == n - row - 1) { dia2++ } if (Math.abs(rows!![row]) == n || Math.abs(cols!![col]) == n || Math.abs(dia1) == n || Math.abs(dia2) == n) { return player } return 0 } /** Player {player} makes a move at ({row}, {col}). @param row The row of the board. @param col The column of the board. @param player The player, can be either 1 or 2. @return The current winning condition, can be either: 0: No one wins. 1: Player 1 wins. 2: Player 2 wins. */ fun move(row: Int, col: Int, player: Int): Int { /* * solution 1:Time complexity: O(n*n), Space complexity:O(n*n) * */ val localMatrix = matrix localMatrix!![row][col] = player //check row var win = true for (i in localMatrix.indices) { if (localMatrix[row][i] != player) { win = false break } } if (win) { return player } //check columns win = true for (i in localMatrix.indices) { if (localMatrix[i][col] != player) { win = false break } } if (win) { return player } //check back diagonal win = true for (i in localMatrix.indices) { if (localMatrix[i][i] != player) { win = false break } } if (win) { return player } //check forward diagonal win = true for (i in localMatrix.indices) { if (localMatrix[i][localMatrix.size - i - 1] != player) { win = false break } } if (win) { return player } return 0 } }