[Leetcode] 348. Design Tic-Tac-Toe 解题报告
来源:互联网 发布:三维测量仪编程教学 编辑:程序博客网 时间:2024/06/05 16:11
题目:
Design a Tic-tac-toe game that is played between two players on a n x n grid.
You may assume the following rules:
- A move is guaranteed to be valid and is placed on an empty block.
- Once a winning condition is reached, no more moves is allowed.
- A player who succeeds in placing n of their marks in a horizontal, vertical, or diagonal row wins the game.
Example:
Given n = 3, assume that player 1 is "X" and player 2 is "O" in the board.TicTacToe toe = new TicTacToe(3);toe.move(0, 0, 1); -> Returns 0 (no one wins)|X| | || | | | // Player 1 makes a move at (0, 0).| | | |toe.move(0, 2, 2); -> Returns 0 (no one wins)|X| |O|| | | | // Player 2 makes a move at (0, 2).| | | |toe.move(2, 2, 1); -> Returns 0 (no one wins)|X| |O|| | | | // Player 1 makes a move at (2, 2).| | |X|toe.move(1, 1, 2); -> Returns 0 (no one wins)|X| |O|| |O| | // Player 2 makes a move at (1, 1).| | |X|toe.move(2, 0, 1); -> Returns 0 (no one wins)|X| |O|| |O| | // Player 1 makes a move at (2, 0).|X| |X|toe.move(1, 0, 2); -> Returns 0 (no one wins)|X| |O||O|O| | // Player 2 makes a move at (1, 0).|X| |X|toe.move(2, 1, 1); -> Returns 1 (player 1 wins)|X| |O||O|O| | // Player 1 makes a move at (2, 1).|X|X|X|
Follow up:
Could you do better than O(n2) per move()
operation?
思路:
这道题目的思路没有什么特别奇怪的。只是我开始用了二维数组来表示棋盘,这样空间复杂度就成为O(n^2),move函数的时间复杂度是O(n)。后来发现一种更高效的实现方法:用两个数组和两个整数表示一个player目前达到的状态。这样空间复杂度就可以降低到O(n),而move的时间复杂度竟然可以降低到O(1)。
这种面试题到处都是坑啊!最优算法往往未必就能一下子想到。
代码:
class TicTacToe {public: /** Initialize your data structure here. */ TicTacToe(int n) { rows_first.resize(n, 0); rows_second.resize(n, 0); cols_first.resize(n, 0); cols_second.resize(n, 0); diag_first = diag_second = anti_diag_first = anti_diag_second = 0; size = n; } /** 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. */ int move(int row, int col, int player) { if(player == 1) { if(++rows_first[row] == size) return 1; if(++cols_first[col] == size) return 1; if(row == col && ++diag_first == size) return 1; if(row + col == size - 1 && ++anti_diag_first == size) return 1; } else { if(++rows_second[row] == size) return 2; if(++cols_second[col] == size) return 2; if(row == col && ++diag_second == size) return 2; if(row + col == size - 1 && ++anti_diag_second == size) return 2; } return 0; }private: vector<int> rows_first, rows_second; vector<int> cols_first, cols_second; int diag_first, diag_second, anti_diag_first, anti_diag_second; int size;};/** * Your TicTacToe object will be instantiated and called as such: * TicTacToe obj = new TicTacToe(n); * int param_1 = obj.move(row,col,player); */
阅读全文
0 0
- [leetcode] 348. Design Tic-Tac-Toe 解题报告
- [Leetcode] 348. Design Tic-Tac-Toe 解题报告
- Leetcode Everyday: 348. Design Tic-Tac-Toe
- Leetcode 348. Design Tic-Tac-Toe
- leetcode Design Tic-Tac-Toe
- 348. Design Tic-Tac-Toe
- 348. Design Tic-Tac-Toe
- LeetCode 348. Design Tic-Tac-Toe(井字棋)
- (未完成!)LeetCode 348. Design Tic-Tac-Toe 设计井字棋游戏
- Design Tic-Tac-Toe
- Design Tic-Tac-Toe
- Design Tic-Tac-Toe
- Problem A. Tic-Tac-Toe-Tomek【解题报告】
- Tic-Tac-Toe
- [cf]Tic-tac-toe
- C - Tic-tac-toe
- Minimax-Tic Tac Toe
- FZU Tic-Tac-Toe
- linux的历史命令
- HNUSTOJ-1696 简单验证码识别(模拟)
- Maven学习 --- <distributionManagement>
- python数据结构之元组
- While 语句的使用
- [Leetcode] 348. Design Tic-Tac-Toe 解题报告
- python-pandas 时间日期的处理(下篇)
- NYOJ 448 寻找最大数
- 网易研发工程师编程题——小易的升级之路
- npm install -g cordova err 解决办法
- 如何看待你深爱的她或他
- 用java实现的简单控制台通讯录
- JAVA事务的概念
- [HDU5452]Minimum Cut