go语言题解LeetCode1275找出井字棋的获胜者示例

目录
  • 题目描述
  • 思路分析
  • AC 代码

题目描述

1275. 找出井字棋的获胜者 - 力扣(LeetCode)

A 和 B 在一个 3 x 3 的网格上玩井字棋。

井字棋游戏的规则如下:

  • 玩家轮流将棋子放在空方格 (" ") 上。
  • 第一个玩家 A 总是用 "X" 作为棋子,而第二个玩家 B 总是用 "O" 作为棋子。
  • "X" 和 "O" 只能放在空方格中,而不能放在已经被占用的方格上。
  • 只要有 3 个相同的(非空)棋子排成一条直线(行、列、对角线)时,游戏结束。
  • 如果所有方块都放满棋子(不为空),游戏也会结束。
  • 游戏结束后,棋子无法再进行任何移动。

给你一个数组 moves,其中每个元素是大小为 2 的另一个数组(元素分别对应网格的行和列),它按照 AB 的行动顺序(先 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";
		}
    }
}

以上就是go语言题解LeetCode1275找出井字棋的获胜者示例的详细内容,更多关于go题解井字棋获胜者的资料请关注我们其它相关文章!

(0)

相关推荐

  • Go语言题解LeetCode1266访问所有点的最小时间示例

    目录 题目描述 思路分析 AC 代码 题目描述 1266. 访问所有点的最小时间 - 力扣(LeetCode) 平面上有 n 个点,点的位置用整数坐标表示 points[i] = [xi, yi] .请你计算访问所有这些点需要的 最小时间(以秒为单位). 你需要按照下面的规则在平面上移动: 每一秒内,你可以: 沿水平方向移动一个单位长度,或者 沿竖直方向移动一个单位长度,或者 跨过对角线移动 sqrt(2) 个单位长度(可以看作在一秒内向水平和竖直方向各移动一个单位长度). 必须按照数组中出现的

  • Go语言题解LeetCode1260二维网格迁移示例详解

    目录 题目描述 示例 1: 示例 2: 示例 3: 思路分析 AC 代码 题目描述 1260. 二维网格迁移 - 力扣(LeetCode) 给你一个 m 行 n 列的二维网格 grid 和一个整数 k.你需要将 grid 迁移 k 次. 每次「迁移」操作将会引发下述活动: 位于 grid[i][j] 的元素将会移动到 grid[i][j + 1]. 位于 grid[i][n - 1] 的元素将会移动到 grid[i + 1][0]. 位于 grid[m - 1][n - 1] 的元素将会移动到 

  • Go语言题解LeetCode35搜索插入位置示例详解

    目录 题目描述 思路分析 AC 代码 总结 优先考虑边界情况 红蓝标记解法 代码 题目描述 原题链接 : 35. 搜索插入位置 - 力扣(LeetCode) (leetcode-cn.com) 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引.如果目标值不存在于数组中,返回它将会被按顺序插入的位置. 请必须使用时间复杂度为 O(log n) 的算法. 示例 1: 输入: nums = [1,3,5,6], target = 5 输出: 2 示例 2: 输入: nums = [1,3

  • go语言题解LeetCode88合并两个有序数组示例

    目录 题目描述 思路分析 AC 代码 题目描述 原题链接 : 88. 合并两个有序数组 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目. 请你 合并 nums2 到 nums1 中,使合并后的数组同样按 非递减顺序 排列. 注意:最终,合并后数组不应由函数返回,而是存储在数组 nums1 中.为了应对这种情况,nums1 的初始长度为 m + n,其中前 m 个元素表示应合并的元素,后 n 个元素

  • go语言题解LeetCode66加一示例详解

    目录 题目描述 思路分析 AC 代码 小结 JavaScript 66题 代码 python3 循环判断 分析: JAVA解决进位问题 解题思路 代码 题目描述 原题链接 : 66. 加一 给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一. 最高位数字存放在数组的首位, 数组中每个元素只存储单个数字. 你可以假设除了整数 0 之外,这个整数不会以零开头. 示例 1: 输入:digits = [1,2,3] 输出:[1,2,4] 解释:输入数组表示数字 123. 示例 2:

  • go语言题解LeetCode453最小操作次数使数组元素相等

    目录 题目描述 思路分析 AC 代码 小结 遍历数组一次 解题思路 代码 强行找规律 解题思路 代码 题目描述 原题链接 : 453. 最小操作次数使数组元素相等 - 力扣(LeetCode) (leetcode-cn.com) 给你一个长度为 n 的整数数组,每次操作将会使 n - 1 个元素增加 1 .返回让数组所有元素相等的最小操作次数. 示例 1: 输入:nums = [1,2,3] 输出:3 解释: 只需要3次操作(注意每次操作会增加两个元素的值): [1,2,3] => [2,3,3

  • go语言题解LeetCode1275找出井字棋的获胜者示例

    目录 题目描述 思路分析 AC 代码 题目描述 1275. 找出井字棋的获胜者 - 力扣(LeetCode) A 和 B 在一个 3 x 3 的网格上玩井字棋. 井字棋游戏的规则如下: 玩家轮流将棋子放在空方格 (" ") 上. 第一个玩家 A 总是用 "X" 作为棋子,而第二个玩家 B 总是用 "O" 作为棋子. "X" 和 "O" 只能放在空方格中,而不能放在已经被占用的方格上. 只要有 3 个相同的(

  • C语言实现简易井字棋游戏

    井子棋承载了每个人孩童时的美好时光,小到书本.纸张,大到课桌.墙壁,总能找到井字棋盘的痕迹.今天我们就来实际操作一番,用C语言完成一个简单的井字棋游戏,让我们一起重温美好. 棋盘如下: **功能描述:**棋盘共分为九个格子,一方执"O"为棋,一方执"X"为棋,双方依次选择格子.己方棋子率先连成三子的获胜,若棋盘占满仍未分胜负,则打成平局. 具体功能实现: 1.在页面选择玩家vs玩家,或玩家vs电脑 2.玩家下棋时,输入对应格子的坐标 3.电脑下棋时,使用随机值选择坐

  • C语言实现简单的井字棋游戏

    本文实例为大家分享了C语言实现简单井字棋游戏的具体代码,供大家参考,具体内容如下 1.什么是井字棋 井字棋相信大部分人都玩过 规则:双方轮流放子,当某一方的三个子连成一线(行,列,对角)时,该方获胜. 2.游戏前的准备 1. 菜单 游戏正式开始前我们可以为用户提供一个选择菜单,笔者做了一个最简单的游戏开始菜单: 代码: /*菜单*/ int menu() { printf("###########################\n"); printf("## 1.Play

  • C语言实现简单井字棋游戏

    本文实例为大家分享了C语言实现简单井字棋游戏的具体代码,供大家参考,具体内容如下 游戏截图 源代码 person.h //玩家对战 void person() { int i,j; initMap(map); //打印棋局 displayMap(map); //未分出胜负且棋局未落满子前无限循环 while(1) { //获取玩家下子位置 getXY(&i,&j); //玩家落子 setPiece(map,i,j); //清屏 system("cls"); //打印棋局

  • C语言实现井字棋(三子棋)

    本文实例为大家分享了C语言实现井字棋的具体代码,供大家参考,具体内容如下 一.实现思路 1.初始化数组 三子棋是九宫格的格式,所以用二维数组接收数据.用'O'代表电脑下的子,'X'代表玩家下的子.未下子的时候初始化 ' '(space).则二维数组为"char"类型,大小为char board[3][3]. 2.打印棋盘 打印出井字的棋盘,同时为了将数据显示在每格的中间,用空格隔开(" %c |")的格式设置棋盘"|"用来形成竖,接着打印&quo

  • 利用C语言实现三子棋(井字棋)小游戏

    本文实例为大家分享了C语言实现三子棋(井字棋)小游戏的具体代码,供大家参考,具体内容如下 推荐阅读顺序(不建议跳过) 先看实现之后的界面 -- 然后看分析程序要实现的步骤 -- 之后在看翻到test.c部分 -- 在test.c中找到main()函数 -- 从main函数的第一步开始看 -- 遇到自定义函数请到game.h源文件中找到相应函数的详情 辅助阅读: game.h文件中放的是函数的声明(引用头文件) game.c文件中放的是函数的详情(怎么用代码实现相应步骤的) test.c文件中放的

  • 用C语言实现井字棋游戏代码

    目录 前言 首先得确定程序实现的功能 直接上代码: 1. 菜单界面 2. 棋盘打印 3. 玩家下棋 4. 电脑下棋(智障下棋版,毫无智能) 5. 判断输赢 搞定 总结 前言 我们都玩过或见过这样一种简单地下棋游戏,两位玩家在一个井字形状的棋盘上,用‘*’和‘#’来下棋,获胜条件是横竖斜任意一列三子成列.那如何在C语言怎么写一个简单地黑框框里运行的井字棋呢,我们在接下来开始从0实施这一工程. 首先得确定程序实现的功能 在写代码时列出需求方便我们后面实现它们. 菜单界面棋盘打印棋子存储采用二维数组.

  • C语言实现井字棋(三子棋)

    本文实例为大家分享了C语言实现井字棋的具体代码,供大家参考,具体内容如下 一.实现思路 1.初始化数组 三子棋是九宫格的格式,所以用二维数组接收数据.用'O'代表电脑下的子,'X'代表玩家下的子.未下子的时候初始化 ' '(space).则二维数组为"char"类型,大小为char board[3][3]. 2.打印棋盘 打印出井字的棋盘,同时为了将数据显示在每格的中间,用空格隔开(" %c |")的格式设置棋盘"|"用来形成竖,接着打印&quo

  • 利用C语言实现三子棋(井字棋)小游戏

    本文实例为大家分享了C语言实现三子棋(井字棋)小游戏的具体代码,供大家参考,具体内容如下 推荐阅读顺序(不建议跳过) 先看实现之后的界面 -- 然后看分析程序要实现的步骤 -- 之后在看翻到test.c部分 -- 在test.c中找到main()函数 -- 从main函数的第一步开始看 -- 遇到自定义函数请到game.h源文件中找到相应函数的详情 辅助阅读: game.h文件中放的是函数的声明(引用头文件) game.c文件中放的是函数的详情(怎么用代码实现相应步骤的) test.c文件中放的

  • C语言二维数组应用之井字棋游戏

    本文实例为大家分享了C语言实现井字棋游戏的具体代码,供大家参考,具体内容如下 数组是C语言中一种重要的数据类型,接下来我和大家分享用二维数组完成一个井字棋游戏. 井字棋,是一种在3*3格子上进行的连珠游戏,和五子棋类似.游戏需要的工具仅为纸和笔,然后由分别代表O和X的两个游戏者轮流在格子里留下标记(一般来说先手者为X),任意三个标记形成一条直线,则为获胜. 井字棋的规则想必大家都已非常清楚,下面来简单梳理一下完成这个游戏的主要思路 一.变量的定义 1.首先要定义棋盘变量为一个3*3的二维数组 

随机推荐