每日一题---794. 有效的井字游戏[力扣][Go]

简介: 每日一题---794. 有效的井字游戏[力扣][Go]

题目描述

给你一个字符串数组 board 表示井字游戏的棋盘。当且仅当在井字游戏过程中,棋盘有可能达到 board 所显示的状态时,才返回 true 。

井字游戏的棋盘是一个 3 x 3 数组,由字符 ’ ',‘X’ 和 ‘O’ 组成。字符 ’ ’ 代表一个空位。

以下是井字游戏的规则:

  • 玩家轮流将字符放入空位(’ ')中。
  • 玩家 1 总是放字符 ‘X’ ,而玩家 2 总是放字符 ‘O’ 。
  • ‘X’ 和 ‘O’ 只允许放置在空位中,不允许对已放有字符的位置进行填充。
  • 当有 3 个相同(且非空)的字符填充任何行、列或对角线时,游戏结束。
  • 当所有位置非空时,也算为游戏结束。
  • 如果游戏结束,玩家不允许再放置字符。

解题代码

分类讨论

func validTicTacToe(board []string) bool {
  // X,O 的数量
  xnum,onum := 0,0
  for _, s := range board {
    for _, i2 := range s {
      if i2 == 'X' {
        xnum ++
      }
      if i2 == 'O' {
        onum ++
      }
    }
  }
  // 行
  for _, s := range board {
    if s[0] == 'X' && s[0] == s[1] && s[1] == s[2] {
      if onum == xnum - 1 {
        return true
      } else {
        return false
      }
    }
    if s[0] == 'O' && s[0] == s[1] && s[1] == s[2] {
      if onum == xnum {
        return true
      } else {
        return false
      }
    }
  }
  // 列
  for i := 0; i < 3; i++ {
    if board[1][i] == 'X' && board[1][i] == board[0][i] && board[1][i] == board[2][i] {
      if onum == xnum - 1 {
        return true
      } else {
        return false
      }
    }
    if board[1][i] == 'O' && board[1][i] == board[0][i] && board[1][i] == board[2][i] {
      if onum == xnum {
        return true
      } else {
        return false
      }
    }
  }
  // 斜
  if (board[1][1] == 'O' && board[1][1] == board[0][0] && board[1][1] == board[2][2]) || (board[1][1] == 'O' && board[1][1] == board[0][2] && board[1][1] == board[2][0]){
    if onum == xnum {
      return true
    } else {
      return false
    }
  }
  if (board[1][1] == 'X' && board[1][1] == board[0][0] && board[1][1] == board[2][2]) || (board[1][1] == 'O' && board[1][1] == board[0][2] && board[1][1] == board[2][0]){
    if onum == xnum - 1 {
      return true
    } else {
      return false
    }
  }
  if onum > xnum || xnum > onum + 1{
    return false
  }
  return true
}

提交结果


相关文章
|
6月前
|
Go C++
【力扣】2696. 删除子串后的字符串最小长度(模拟 栈 C++ Go实现栈)
【2月更文挑战第18天】2696. 删除子串后的字符串最小长度(模拟 栈 C++ Go实现栈)
59 6
|
30天前
|
算法
Leetcode第45题(跳跃游戏II)
这篇博客文章讨论了如何使用贪心算法解决LeetCode第45题“跳跃游戏II”,目的是找到使用最少跳跃次数到达数组末尾的策略。
70 8
Leetcode第45题(跳跃游戏II)
|
3月前
|
算法
LeetCode第55题跳跃游戏
LeetCode第55题"跳跃游戏"的解题方法,通过记录当前最远可达到的位置并判断每个位置是否可达以及能否到达末尾,有效解决了跳跃至数组末尾的可行性问题。
LeetCode第55题跳跃游戏
|
30天前
Leetcode第55题(跳跃游戏)
LeetCode第55题“跳跃游戏”要求判断在一个非负整数数组中,从第一个位置出发,是否能够到达最后一个位置,其中每个位置的元素代表可跳跃的最大长度。
26 0
|
3月前
|
人工智能 算法 Java
LeetCode经典算法题:井字游戏+优势洗牌+Dota2参议院java解法
LeetCode经典算法题:井字游戏+优势洗牌+Dota2参议院java解法
48 1
|
3月前
|
Python
【Leetcode刷题Python】174. 地下城游戏
LeetCode 174题 "地下城游戏" 的Python解决方案,使用动态规划算法计算骑士从左上角到右下角拯救公主所需的最低初始健康点数。
48 3
|
3月前
|
算法 索引 Python
【Leetcode刷题Python】55. 跳跃游戏
解决LeetCode "跳跃游戏"问题的Python实现代码,使用了贪心算法的思路。代码中初始化最远可到达位置 max_k,并遍历数组 nums,通过更新 max_k 来记录每次能跳到的最远位置,如果在任何时刻 max_k 大于或等于数组的最后一个索引,则返回 True,表示可以到达数组的末尾;如果当前索引 i 超出了 max_k,则返回 False,表示无法继续前进。时间复杂度为 O(n),空间复杂度为 O(1)。
47 1
|
3月前
|
算法
LeetCode第45题跳跃游戏 II
LeetCode第45题"跳跃游戏 II"的解题方法,通过一次循环和选择每个位置的最大可跳距离,有效减少了跳跃次数,简化了问题。
|
5月前
力扣-2029-石子游戏-‘屎山’代码
力扣-2029-石子游戏-‘屎山’代码
40 3
|
5月前
|
算法 数据挖掘 开发者
LeetCode题目55:跳跃游戏【python5种算法贪心/回溯/动态规划/优化贪心/索引哈希映射 详解】
LeetCode题目55:跳跃游戏【python5种算法贪心/回溯/动态规划/优化贪心/索引哈希映射 详解】