文章目录

  • 1. 题目
  • 2. 解题

1. 题目

请在 n × n 的棋盘上,实现一个判定井字棋(Tic-Tac-Toe)胜负的神器,判断每一次玩家落子后,是否有胜出的玩家。

在这个井字棋游戏中,会有 2 名玩家,他们将轮流在棋盘上放置自己的棋子。

在实现这个判定器的过程中,你可以假设以下这些规则一定成立:

  1 . 每一步棋都是在棋盘内的,并且只能被放置在一个空的格子里;2 . 一旦游戏中有一名玩家胜出的话,游戏将不能再继续;3 . 一个玩家如果在同一行、同一列或者同一斜对角线上都放置了自己的棋子,那么他便获得胜利。
示例:
给定棋盘边长 n = 3, 玩家 1 的棋子符号是 "X",玩家 2 的棋子符号是 "O"。TicTacToe toe = new TicTacToe(3);toe.move(0, 0, 1); -> 函数返回 0 (此时,暂时没有玩家赢得这场对决)
|X| | |
| | | |    // 玩家 1 在 (0, 0) 落子。
| | | |toe.move(0, 2, 2); -> 函数返回 0 (暂时没有玩家赢得本场比赛)
|X| |O|
| | | |    // 玩家 2 在 (0, 2) 落子。
| | | |toe.move(2, 2, 1); -> 函数返回 0 (暂时没有玩家赢得比赛)
|X| |O|
| | | |    // 玩家 1 在 (2, 2) 落子。
| | |X|toe.move(1, 1, 2); -> 函数返回 0 (暂没有玩家赢得比赛)
|X| |O|
| |O| |    // 玩家 2 在 (1, 1) 落子。
| | |X|toe.move(2, 0, 1); -> 函数返回 0 (暂无玩家赢得比赛)
|X| |O|
| |O| |    // 玩家 1 在 (2, 0) 落子。
|X| |X|toe.move(1, 0, 2); -> 函数返回 0 (没有玩家赢得比赛)
|X| |O|
|O|O| |    // 玩家 2 在 (1, 0) 落子.
|X| |X|toe.move(2, 1, 1); -> 函数返回 1 (此时,玩家 1 赢得了该场比赛)
|X| |O|
|O|O| |    // 玩家 1 在 (2, 1) 落子。
|X|X|X|进阶:
您有没有可能将每一步的 move() 操作优化到比 O(n^2) 更快吗?

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/design-tic-tac-toe
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 解题

类似题目:
LeetCode 1275. 找出井字棋的获胜者(位运算)
程序员面试金典 - 面试题 16.04. 井字游戏(计数)

  • 记录每个人,每行、列、2对角线的棋子个数
class TicTacToe {vector<vector<int>> R;vector<vector<int>> C;vector<int> X45;//45度对角线vector<int> X135;//135度对角线int N;
public:/** Initialize your data structure here. */TicTacToe(int n) {N = n;R = vector<vector<int>> (2,vector<int>(n,0));C = vector<vector<int>> (2,vector<int>(n,0));X45 = vector<int> (2,0);//45度对角线X135 = vector<int> (2,0);//135度对角线}/** 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(row == col)X45[player-1]++;if(row+col == N-1)X135[player-1]++;R[player-1][row]++;C[player-1][col]++;if(R[player-1][row]==N || C[player-1][col]==N || X45[player-1]==N || X135[player-1]==N)return player;return 0;}
};

68 ms 18.7 MB


我的CSDN博客地址 https://michael.blog.csdn.net/

长按或扫码关注我的公众号(Michael阿明),一起加油、一起学习进步!

LeetCode 348. 判定井字棋胜负(计数)相关推荐

  1. leetcode348. 判定井字棋胜负 好麻烦的代码

    请在 n × n 的棋盘上,实现一个判定井字棋(Tic-Tac-Toe)胜负的神器,判断每一次玩家落子后,是否有胜出的玩家. 在这个井字棋游戏中,会有 2 名玩家,他们将轮流在棋盘上放置自己的棋子. ...

  2. LeetCode 1275. 找出井字棋的获胜者(位运算)

    1. 题目 A 和 B 在一个 3 x 3 的网格上玩井字棋. 井字棋游戏的规则如下: 玩家轮流将棋子放在空方格 (" ") 上. 第一个玩家 A 总是用 "X" ...

  3. LeetCode简单题之找出井字棋的获胜者

    题目 A 和 B 在一个 3 x 3 的网格上玩井字棋. 井字棋游戏的规则如下: 玩家轮流将棋子放在空方格 (" ") 上. 第一个玩家 A 总是用 "X" 作 ...

  4. 井字棋LeetCode简单题

    给定一个二维数组board,代表棋盘,其中元素为1的代表是当前玩家的棋子,0表示没有棋子,-1代表是对方玩家的棋子.当一方棋子在横竖斜方向上有连成排的及获胜(及井字棋规则),返回当前玩家是否胜出. 测 ...

  5. python井字棋ai,python 井字棋(Tic Tac Toe)

    说明 用python实现了井字棋,整个框架是本人自己构思的,自认为比较满意.另外,90%+的代码也是本人逐字逐句敲的. minimax算法还没完全理解,所以参考了这里的代码,并作了修改. 特点 可以选 ...

  6. 用数学方法计算井字棋合法局面数——波利亚定理的简单应用

    用数学方法计算井字棋合法局面数--波利亚定理的简单应用 0.前言 记不得那天在B站发现一个互动下井字棋智商普查(BV1JE411G71J),想当年被小学同学评价为无敌破战士(显然到现在都不知道这称号是 ...

  7. [C++] 井字棋游戏源码

    TicTac.h 1 #define EX 1 //该点左鼠标 2 #define OH 2 //该点右鼠标 3 4 class CMyApp : public CWinApp 5 { 6 publi ...

  8. 用c语言编写的打字母游戏,用C语言编写小游戏——“井字棋”

    原标题:用C语言编写小游戏--"井字棋" 作者:Milo Yip 来源:知乎 原文链接:https://zhuanlan.zhihu.com/p/39581573 在 Milo Y ...

  9. 井字棋(C语言实现,可运行玩耍,自行编写)

    井字棋,英文名叫Tic-Tac-Toe,是一种在3*3格子上进行的连珠游戏,和五子棋类似,由于棋盘一般不画边框,格线排成井字故得名.游戏需要的工具仅为纸和笔,然后由分别代表O和X的两个游戏者轮流在格子 ...

最新文章

  1. java 打包目录_Java打包文件目录问 zip文件
  2. AI大牛周明打造的轻量“孟子模型”开源!靠10亿参数冲上CLUE榜第三,可用于新闻分类、文案生成...
  3. 熟读《阿里巴巴java开发手册》(五、 MySQL 数据库)
  4. java小程序扑克牌_用Java来写一个模拟斗地主发牌的小程序
  5. 判断当前界面是该fragment_学不动也要学!探究Fragment延迟加载的前世今生
  6. Video4Linux
  7. 3.IDA-数据显示窗口(导出窗口、导入窗口、String窗口、...窗口)
  8. STM32/M3/M0关于开关总中断的问题
  9. 打算升级到 Monterey?我们为你准备了一份 macOS 安全升级指南
  10. 火狐中jq的attr出现的bug问题用prop代替
  11. 深入理解计算机系统第四版_技术干货 |深入理解计算机系统之链接
  12. 【linux】-bash: vim: 未找到命令
  13. C#调用系统打印机(XP-58小票打印)
  14. 遍历出List<Map>的Key / Value
  15. imap接收邮件服务器,配置 Outlook 从 IMAP 服务器接收邮件
  16. DIV+CSS学习笔记总结篇
  17. debian 7 安装 rz sz lrzsz
  18. java 抓取网页内容小工具
  19. CSS clip:rect矩形剪裁功能及一些应用介绍
  20. 数字信号处理实验一(离散时间信号的MATLAB实现)

热门文章

  1. 【Python基础入门系列】第06天:Python 模块和包
  2. 在使用apt-get update 时更行列表,显示[Connecting to archive.ubuntu.com (2001:67c:1360:8001::21)]超时
  3. 单片机oled显示浮点数函数_问中文编程在单片机上实现一个电子时钟,总共有几步?...
  4. 【代码笔记】iOS-清除图片缓存UIActionSheet
  5. 【学习笔记】【C语言】类型说明符
  6. golang的sync包例子
  7. Android开发实践:常用NDK命令行参数
  8. 嵌入式软件开发注意事项一
  9. 判断输入的IP地址是否合法
  10. 删除list中的一个节点