LeetCode 面试题 16.04. 井字游戏 Java

一看到井字棋游戏最先想到决策树,这个题是直接判断输赢。注意不是9个格子,是N*N个格子。那么第一步应该把一维数组放到二维数组中,否则无法遍历。

遇到X,转换成1。遇到O,转换成-1。否则为0
遍历二维数组的每一行,每一列,两条对角线。如果和为N,则输出"X",和为-N,则输出"O"。遍历时需要保存0的数量,用于判断还有没有空位。flag表示有无胜利者。

class Solution {
    public String tictactoe(String[] board) {
        int n = board.length;
        int ox[][] = new int[n][n];
        for(int i=0;i<n;i++){
            for(int j=0;j<n;j++){
                if(board[i].charAt(j) == 'X'){
                    ox[i][j] = 1;
                }else if(board[i].charAt(j) == 'O'){
                    ox[i][j] = -1;
                }else{
                    ox[i][j] = 0;
                }
            }
        }
        return win(ox);
    }

    public String win(int nums[][]){
        int n=nums.length;
        int rowsum=0,colsum=0,zeronum=0,diagonal1=0,diagonal2=0;
        boolean flag=false;
        for(int i=0;i<nums.length;i++){
            rowsum=0;
            for(int j=0;j<nums.length;j++){
                if(nums[i][j]==0){
                    zeronum++;
                }
                rowsum+=nums[i][j];
                if(i==j){
                    diagonal1+=nums[i][j];
                }
            }
            if(rowsum==n){
                flag=true;
                return "X";
            }
            if(rowsum==-n){
                flag=true;
                return "O";
            }
        }
        if(diagonal1==n){
            flag=true;
            return "X";
        }
        if(diagonal1==-n){
            flag=true;
            return "O";
        }
        for(int j=0;j<n;j++){
            colsum=0;
            for(int i=0;i<n;i++){
                colsum+=nums[i][j];
                if(i+j==n-1){
                    diagonal2+=nums[i][j];
                }
            }
            if(colsum==n){
                flag=true;
                return "X";
            }
            if(colsum==-n){
                flag=true;
                return "O";
            }
        }
        if(diagonal2==n){
            flag=true;
            return "X";
        }
        if(diagonal2==-n){
            flag=true;
            return "O";
        }
        if(!flag){
            if(zeronum==0){
                return "Draw";
            }else{
                return "Pending";
            }
        }
        return null;
    }
}
posted @ 2020-05-30 10:22  菜鸡A  阅读(746)  评论(0编辑  收藏  举报