栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

有效的井字游戏

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

有效的井字游戏

题目

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

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

思路

: 先统计board中所有X和O的数量

判断有效的条件

是:如果是X赢,Xcount-Ocount=1
如果是O赢 ,Ocount-Xcount=0
如果棋盘不成立的话,xcount!=ocount&&xcount-ocount!=1
其次定义一个boolean方法,看棋盘中是否有(X/O)横纵斜成立的情况。

class Solution {
    public boolean validTicTacToe(String[] board) {
int xcount=0;
int ocount=0;
for(int i=0;i<3;i++){
    for(int j=0;j<3;j++){
        char c=board[i].charAt(j);
        if(c=='X'){
xcount++;
        }
           if(c=='O'){
ocount++;
        }
    }
}
//统计出现的次数
    if(xcount!=ocount&&xcount-ocount!=1){
        return false;
    }
    if(win(board,"XXX")&&xcount-ocount!=1){
return false;
    }
     if(win(board,"OOO")&&xcount-ocount!=0){
return false;
    }

 return true;

    }
public boolean win(String[]board,String flag){
    //横向赢
    for(int i=0;i<3;i++){
if(flag.equals(board[i])){
    return true;
}
//竖着赢
if(flag.equals(""+board[0].charAt(i)+board[1].charAt(i)+board[2].charAt(i))){
    return true;
}
    }

//判断是否斜着赢,在for循环内单独判断。
if(flag.equals(""+board[0].charAt(0)+board[1].charAt(1)+board[2].charAt(2))){
    return true;
}
if(flag.equals(""+board[0].charAt(2)+board[1].charAt(1)+board[2].charAt(0))){
    return true;
}
  return false;
    }
  
}

也可参考另一种代码实现方式

class Solution {
    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;
    }
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/928846.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号