JavaInterview JavaInterview
首页
指南
分类
标签
归档
  • CSDN (opens new window)
  • 文档集合 (opens new window)
  • 系统架构 (opens new window)
  • 微信号 (opens new window)
  • 公众号 (opens new window)

『Java面试+Java学习』
首页
指南
分类
标签
归档
  • CSDN (opens new window)
  • 文档集合 (opens new window)
  • 系统架构 (opens new window)
  • 微信号 (opens new window)
  • 公众号 (opens new window)
  • 指南
  • 简历

  • Java

  • 面试

  • 算法

  • algorithm
  • leetcode
JavaInterview.cn
2022-10-15
目录

有效的井字游戏Java

文章发布较早,内容可能过时,阅读注意甄别。

# 题目

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

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

以下是井字游戏的规则:

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

示例 1:

输入:board = ["O  ","   ","   "]
输出:false
解释:玩家 1 总是放字符 "X" 。

示例 2:

输入:board = ["XOX"," X ","   "]
输出:false
解释:玩家应该轮流放字符。

示例 3:

输入:board = ["XOX","O O","XOX"]
输出:true

提示:

  • board.length == 3
  • board[i].length == 3
  • board[i][j] 为 'X'、'O' 或 ' '

# 思路

1、X必须比O多1个或者相同,否则false;

2、X和O不能同时都是赢家,否则false;

3、X赢的时候必须比O多1个,否则false;

4、O赢的时候个数与X相同,否则false;

// 其他的都是true

# 解法


class Solution {
// 1、X必须比O多1个或者相同,否则false; 2、X和O不能同时都是赢家,否则false; 3、X赢的时候必须比O多1个,否则false; 4、O赢得时候个数与X相同,否则false;

// 其他的都是true


    public boolean validTicTacToe(String[] board) {


        if(!countDiff(board)){return false;}
        if(isWinner(board,'X')&&isWinner(board,'O')){return false;}
        if(isWinner(board,'X')&&charCount(board,'X')-charCount(board,'O')!=1){return false;}
        if(isWinner(board,'O')&&charCount(board,'X')!=charCount(board,'O')){return false;}
        return true;
    }
    public int charCount(String[] board,char c){
        int count=0;
        for(int i=0;i<3;i++){for(char ch:board[i].toCharArray()){if(c==ch){count++;}}}
        return count;
    }
    public boolean isWinner(String[] board,char c){
        //判断是不是c(X或者O)赢了,X赢得时候,X比O多1,反之相同
        if(board[0].charAt(0)==board[1].charAt(1)&&board[1].charAt(1)==board[2].charAt(2)&&board[2].charAt(2)==c){return true;}
        if(board[0].charAt(2)==board[1].charAt(1)&&board[1].charAt(1)==board[2].charAt(0)&&board[2].charAt(0)==c){return true;}
        for(int i=0;i<3;i++){
            if(board[i].charAt(0)==board[i].charAt(1)&&board[i].charAt(1)==board[i].charAt(2)&&board[i].charAt(2)==c){return true;}
            if(board[0].charAt(i)==board[1].charAt(i)&&board[1].charAt(i)==board[2].charAt(i)&&board[2].charAt(i)==c){return true;}
        }
        return false;
    }
    public boolean countDiff(String[] board){
        //判断X是不是比O多1或者相同
        int xNum=0;
        int oNum=0;
        for(int i=0;i<3;i++){
            for(char c:board[i].toCharArray()){
                if(c=='X'){xNum++;}
                if(c=='O'){oNum++;}
            }
        }
        return xNum-oNum==0||xNum-oNum==1;
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44

# 总结

  • 分析出几种情况,然后分别对各个情况实现
微信 支付宝
最近更新
01
1633. 各赛事的用户注册率 Java
07-02
02
1636. 按照频率将数组升序排序 Java
07-02
03
1639. 通过给定词典构造目标字符串的方案数 Java
07-02
更多文章>
Theme by Vdoing | Copyright © 2019-2025 JavaInterview.cn
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式