美文网首页
找规律-井字游戏

找规律-井字游戏

作者: 今夜秋风和 | 来源:发表于2024-07-15 07:47 被阅读0次

    井字游戏

    https://leetcode.cn/problems/tic-tac-toe-lcci/description/

    题目分析

    一个N*N 的棋盘,有两个人在空位置放元素,不论中间如何放置,结果是如果出现N个相同元素处于同一行或同一列或同一对角线,就算赢; 没有赢的情况下,如果出现字符数组中包含空格返回Pending,其他情况返回Draw;

    解题思路

    1.输入的一维board数组转化为二维数组,主要方便遍历元素;
    2.基于每行的判断,行不变,列+1,中间遇到空格字符或不相等字符时break, 当列==N时,说明这一行的字符都相等,则返回第一个字符;
    3.基于每列的判断,列不变,行+1,中间遇到空格字符或不相等字符时break,当行 == N时,说明这一列的字符都相等,则返回第一个字符;
    4.基于对角线判断,正向的(行+1,列+1) ,反向的(行-1,列+1),判断逻辑与行,和列的判断相同,区别是赢得情况下返回字符条件不同,正向赢的条件:(行== N && 列== N),反向赢的条件(行 <0 && 列== N);

    代码实现

        public String tictactoe(String[] board) {
            if(board == null || board.length <= 0){
                return null;
            }
            int m = board.length;
            char[][] charArray = new char[m][m];
            int row = 0;
            int index = 0;
            while (row < m) {
                int col = 0;
                while(col < m){
                    charArray[row][col] = board[index].charAt(col);
                    col++;
                }
                row++;
                index++;
            }
            //检测行
            System.out.println("基于行判断");
            for(int i = 0;i < m;i++){
                char firstChar = ' ';
                int j = 0;
                for(;j < m;j++){
                    if(charArray[i][j]  ==' '){
                        break;
                    }else{
                        if(j == 0){
                            firstChar = charArray[i][j];
                        }else{
                            if(charArray[i][j] != firstChar){
                                break;
                            }
                        }
                    }
                }
                System.out.println("j="+j);
                if(j == m){
                    return ""+firstChar;
                }
            }
            System.out.println("基于列判断");
            //基于列
            for(int j = 0;j< m ;j++){
                char firstChar = ' ';
                int i = 0;
                for(; i< m;i++){
                    if(charArray[i][j] == ' '){
                        break;
                    }else{
                        if(i == 0){
                            firstChar = charArray[i][j];
                        }else{
                            if(charArray[i][j] != firstChar){
                                break;
                            }
                        }
                    }
                }
                System.out.println("i="+i+";j="+j);
                if(i == m){
                    return ""+firstChar;
                }
            }
            //基于对角线,行,列各加1
            int i = 0;
            int j = 0;
            char firstChar= ' ';
            while(i < m && j < m){
                if(charArray[i][j] == ' '){
                    break;
                }else{
                    if(i == 0){
                        firstChar = charArray[i][j];
                    }else{
                        if(charArray[i][j] != firstChar){
                            break;
                        }
                    }
                    i++;
                    j++;
                }
            }
            System.out.println("i="+i+";j="+j);
            if(i == m && j == m){
                return ""+firstChar;
            }
            //基于对角线,行-1,列+1
            int k = m-1; //行
            int l = 0; //列
            char secondChar = ' ';
            while(k >= 0 && l < m){
                if(charArray[k][l] == ' '){
                    break;
                }else{
                    if(k == m-1){
                        secondChar = charArray[k][l];
                    } else{
                        if(charArray[k][l] != secondChar){
                            break;
                        }
                    }
                    k--;
                    l++;
                }
            }
            System.out.println("k="+k+";l="+l);
            if(k < 0 && l == m){
                return ""+secondChar;
            }
           //没有人赢的情况下,判断是否存在空字符
            for(int g = 0;g < m;g++){
                for(int h = 0;h < m;h++){
                    if(charArray[g][h] == ' '){
                        return "Pending";
                    }
                }
            }
            return "Draw";
        }
    
    

    相关文章

      网友评论

          本文标题:找规律-井字游戏

          本文链接:https://www.haomeiwen.com/subject/hndncjtx.html