请在 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(n2) 更快吗?

题意因该是想每一次move都把棋盘全部检查一遍,但是没必要。

进阶的意思:只把新move位置的所在行、列、和两个对角线检查一下即可,时间o(n),空间o(n*n)代码如下。

class TicTacToe {int arr[][];/** Initialize your data structure here. */public TicTacToe(int n) {arr=new int[n][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. */public int move(int row, int col, int player) {arr[row][col]=player;if(checkCol(col,player) || checkRow(row,player) || line1(player) || line2(player)){return player;}return 0;}public boolean checkRow(int row,int player) {int len=arr.length;for(int i=0;i<len;i++){if(arr[row][i]!=player){return false;}}return true;}public boolean checkCol(int col,int player) {int len=arr.length;for(int i=0;i<len;i++){if(arr[i][col]!=player){return false;}}return true;}public boolean line1(int player){int len=arr.length;int ans=0;for(int i=0;i<len;i++){if(arr[i][i]!=player){return false;}}return true;}public boolean line2(int player){int len=arr.length;int ans=0;for(int i=0;i<len;i++){if(arr[i][len-i-1]!=player){return false;}}return true;}}/*** Your TicTacToe object will be instantiated and called as such:* TicTacToe obj = new TicTacToe(n);* int param_1 = obj.move(row,col,player);*/

更好的思路,把每一行每一列,和两个对角线的情况记录下来,玩家1使所在行列对角线-1,玩家1使所在行列对角线+1.

只有某个数等于n或-n时,某个玩家会获胜。

class TicTacToe {int rowArr[];int colArr[];int line1=0;int line2=0;/** Initialize your data structure here. */public TicTacToe(int n) {rowArr=new int[n];colArr=new int[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. */public int move(int row, int col, int player) {int n=rowArr.length;int temp=player==1?-1:1;rowArr[row]+=temp;colArr[col]+=temp;if(row==col){line1+=temp;}if(col==n-row-1){line2+=temp;}if(rowArr[row]==n || colArr[col]==n || rowArr[row]==-n || colArr[col]==-n || line1==n || line2==n || line1==-n || line2==-n){return player;}return 0;}}/*** Your TicTacToe object will be instantiated and called as such:* TicTacToe obj = new TicTacToe(n);* int param_1 = obj.move(row,col,player);*/

leetcode348. 判定井字棋胜负 好麻烦的代码相关推荐

  1. LeetCode 348. 判定井字棋胜负(计数)

    文章目录 1. 题目 2. 解题 1. 题目 请在 n × n 的棋盘上,实现一个判定井字棋(Tic-Tac-Toe)胜负的神器,判断每一次玩家落子后,是否有胜出的玩家. 在这个井字棋游戏中,会有 2 ...

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

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

  3. 【C语言实现井字棋及电脑落子优化】

    朋友们,我们还记得以前上课经常和同桌玩起井字棋,那么我们就当我们回忆童年,现在也用C语言来实现井字棋,本次代码相对于初阶的井字棋,在电脑下棋代码部分做了优化,使得电脑更加具有威胁,但是由于博主水平有限 ...

  4. 用TensorFlow基于神经网络实现井字棋(含代码)

    为了展示如何应用神经网络算法模型,我们将使用神经网络来学习优化井字棋(Tic Tac Toe).明确井字棋是一种决策性游戏,并且走棋步骤优化是确定的. 开始 为了训练神经网络模型,我们有一系列优化的不 ...

  5. python井字棋_python实现井字棋小游戏

    本文为大家分享了python实现井字棋小游戏,供大家参考,具体内容如下 周五晚上上了python的选修课,本来以为老师是从python的基础语法开始的,没想到是从turtle画图开始,正好补上了我以前 ...

  6. python井字棋小游戏代码_python实现井字棋小游戏

    本文为大家分享了python实现井字棋小游戏,供大家参考,具体内容如下 周五晚上上了python的选修课,本来以为老师是从python的基础语法开始的,没想到是从turtle画图开始,正好补上了我以前 ...

  7. C语言第十课:编写井字棋游戏(综合练习1)

    目录 前言: 一.文件建立: 1.头文件game.h: 2.函数定义文件game.c: 3.工程测试文件test.c: 二.编写井字棋游戏: 1.程序整体执行思路: 2.menu菜单函数实现: 3.g ...

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

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

  9. 基于Unity设计的井字棋小游戏

    资源下载地址:https://download.csdn.net/download/sheziqiong/86871335 资源下载地址:https://download.csdn.net/downl ...

最新文章

  1. python的继承用法_【后端开发】python中继承有什么用法?python继承的用法详解
  2. mysql受影响的行: 0_mysql执行update语句受影响行数是0
  3. document 获得元素节点,属性节点,文本节点。
  4. sqlplus: error while loading shared libraries
  5. 解决安装IIS时提示找不到zClientm.exe文件的问题
  6. Java中stringbutter_java中string与ButterString的区别
  7. poj1064 二分搜索 挑战程序设计竞赛
  8. matlab求单自由度振动方程为,matlab求解振动方程
  9. 餐厅扫码点餐系统源码 外卖订餐小程序源码
  10. 【长文预警】美团联合创始人王慧文清华产品课
  11. 计算机发展的新用途应用,新时期计算机技术的应用及发展趋势
  12. 基于Arduino的温湿度上传OneNET,同时SIM900A短信报警(1)
  13. [bzoj 2038 OR 清橙A1206 小Z的袜子]莫队算法
  14. 2020年中国数字经济区域发展竞争格局报告
  15. 建立自己的机械臂–编程
  16. 创建签名文件jks 乱码
  17. web漏洞-远端WWW服务支持TRACE请求
  18. 解一元三次方程方程问题细节探讨
  19. 绝对值不等式 AcWing 104. 货仓选址
  20. 海信智慧黑板Android版本,海信智慧黑板,给老师减负,再也不用“喝”粉笔末了...

热门文章

  1. c int转char数组_C语言 指向数组和字符串的指针
  2. Scrum之 评审会议
  3. 解决6410 WINCE6 应用层调用SetSystemPowerState api关机无效的问题
  4. hashmap value占用空间大小_HashMap的put和get实现原理及源码分析
  5. if 组件是否存在_UE4 UMG简介+Slate组件问题排查
  6. MySQL——数据库和表的增删改查
  7. 【转】ABP源码分析十七:DTO 自动校验的实现
  8. 【转】HMAC哈希消息认证码及算法原理
  9. 数据结构 - 栈 (逆波兰计算器)(栈的三种表达式)(前缀、中缀和后缀表达式,后缀也叫逆波兰表达式)(中缀表达式转后缀表达式实现步骤及完整代码)
  10. r语言中1c0怎么表示什么,r语言表示或者用什么符号?