找规律-井字游戏

井字游戏

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";
    }

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容