go语言题解LeetCode1275找出井字棋的获胜者示例
作者:刘09k11 发布时间:2023-07-22 12:30:41
题目描述
1275. 找出井字棋的获胜者 - 力扣(LeetCode)
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 遵循井字棋的规则。
思路分析
官方给的题解是模拟法(不推荐),这种方法是很不好的,就比如说棋盘是10*10那你就需要举例很多种
题目说了这个棋盘中的数据一定是有效的,所以我们可以不考虑棋盘中的数据是否有效这个问题。
思路分析:
我们可以获取最后一颗棋子在棋盘中的位置,然后判断是否存在玩家获胜
如果没有玩家获胜则判断棋盘的状态是Draw还是Pending
AC 代码
class Solution {
public String tictactoe(int[][] moves) {
// 棋盘数组
char checkerboard[][] = new char[3][3];
// 将数组还原成棋盘
for (int i = 0; i < moves.length; i++) {
// 取出当前棋子的行下标
int row = moves[i][0];
// 取出当前棋子的列下标
int col = moves[i][1];
if ((i & 1) == 0) {// 偶数下标,放“X”
checkerboard[row][col] = 'X';
} else {// 奇数下标,放“O”
checkerboard[row][col] = 'O';
}
}
// 获取最后一颗棋子在棋盘的坐标
int[] lastPiece = moves[moves.length - 1];
// 最后一颗棋子的行坐标
int lastRow = lastPiece[0];
// 最后一颗棋子的列坐标
int lastCol = lastPiece[1];
// 创建一个Set集合:帮助判断同一行、同一列、同一斜线的棋子是否相同
Set<Character> helpSet = new HashSet<>();
// 判断一行的棋子是否相同
for (int i = 0; i < checkerboard.length; i++) {
helpSet.add(checkerboard[lastRow][i]);
}
if (helpSet.size() == 1) {// 棋子相同
// 获取最后一颗棋子是哪个玩家下的
return (moves.length - 1 & 1) == 0 ? "A" : "B";
}
// 将helpSet中的数据清空
helpSet.clear();
// 判断一列的棋子是否相同
for (int i = 0; i < checkerboard.length; i++) {
helpSet.add(checkerboard[i][lastCol]);
}
if (helpSet.size() == 1) {// 棋子相同
// 获取最后一颗棋子是哪个玩家下的
return (moves.length - 1 & 1) == 0 ? "A" : "B";
}
// 将helpSet中的数据清空
helpSet.clear();
// 判断斜线的棋子是否相同
if (lastRow == lastCol || Math.abs(lastRow - lastCol) == checkerboard.length - 1) {
for (int i = checkerboard.length - 1, j = 0; i >= 0; i--, j++) {
helpSet.add(checkerboard[i][j]);
}
if (helpSet.size() == 1 && !String.valueOf(helpSet.iterator().next()).trim().equals("")) {// 棋子相同
// 获取最后一颗棋子是哪个玩家下的
return (moves.length - 1 & 1) == 0 ? "A" : "B";
}
// 将helpSet中的数据清空
helpSet.clear();
for (int i = 0; i < checkerboard.length; i++) {
helpSet.add(checkerboard[i][i]);
}
if (helpSet.size() == 1 && !String.valueOf(helpSet.iterator().next()).trim().equals("")) {// 棋子相同
// 获取最后一颗棋子是哪个玩家下的
return (moves.length - 1 & 1) == 0 ? "A" : "B";
}
}
// 判断是否平局
if (moves.length == 9) {
return "Draw";
} else {
return "Pending";
}
}
}
来源:https://juejin.cn/post/7183207261290889253
猜你喜欢
- google 的设计原则中文1.易用性-聚焦在人,方便他们的生活,工作,梦想。2.速度-分秒必争3.简单-简单而强有力4.关联性- 对初学者
- 此代码适合你做网站用,普通朋友可以不用理这个东西!ASP:<%dim objXMLHTTP, qq, pwd qq = &
- SQL Server数据库的六个实用技巧:(一)挂起操作在安装Sql或sp补丁的时候系统提示之前有挂起的安装操作,要求重启,这里往往重启无用
- 对数据库的管理常规就是进行预防性的维护,以及修复那些出现问题的内容。进行检查和修复通常具有四个主要的任务:1. 对表进行优化2. 对表进行分
- 以前经常吃公司旁边的食堂,人多,排队。夏天的时候,我们总要找一个靠窗口通风好的地方坐,没有空调只有风扇,风扇很多,开关都集中在一个地方,应该
- 由于最近在处理shp文件,想要跳出arcpy的限制,所以打算学习一下pyshp包的使用方法。在使用《Python地理空间分析指南(第2版)》
- 前一段时间碰到这样的的问题,Ajax从后台得到的中文信息怎么都是空。后来到网上搜资料,大多是以下这样。用AJAX来GET回一个页面时,RES
- sql语句查询数据库中的表名/列名/主键/自动增长值 ----查询数据库中用户创建的表 ----jsj01 为数据库名 select nam
- 代码如下:function checkip(checkstring)'用正则判断IP是否合法 dim re1 set re1=new
- 我们打开Google的时候可能大家会发现,无论你输入Google的任何网址,它都根据你使用的语言自动判断并跳转到不同的语言界面。也就是你用不
- 定义和用法fopen() 函数打开文件或者 URL。如果打开失败,本函数返回 FALSE。语法fopen(filename,mode,inc
- 阅读上一章:打印样式Chapter 12 CSS布局本书到此为止,讨论的主要是页面内部元素,也就是内容,但是大结构怎么办?长久以来,设计者都
- 代码如下: function astro(birth) astro="" if birth=""
- 一般上电子商务网站买东西的用户分三种:随便看看,就是不买先看看,买不买再说就是来买东西的这样的需求反应到产品页的购买按钮上,我们一般会看到购
- 为了建设班级主页,买了个空间,支持SA FileUp组件。鼓弄了一天,终于有了大致的了解,下面是我的实例,希望对大家有所帮助。大家可以根据自
- “/xxxxx”应用程序中的服务器错误。 -------------------------------------------------
- js运行效果,含公历农历,生肖及节日的javascript日历代码:<html><head><meta htt
- 如何提高Request集合的使用效率?以加快程序处理速度: strTitle=Request.Form("Title&q
- 登录SYS创建临时表空间/*创建临时表空间 */create temporary tablespace 表空间名 t
- 1.断点调试是啥?难不难?断点调试其实并不是多么复杂的一件事,简单的理解无外呼就是打开浏览器,打开sources找到js文件,在行号上点一下