代码编织梦想

【程序员面试金典】面试题 16.04. 井字游戏

题目描述

描述:设计一个算法,判断玩家是否赢了井字游戏。输入是一个 N x N 的数组棋盘,由字符" ",“X"和"O"组成,其中字符” "代表一个空位。

以下是井字游戏的规则:

玩家轮流将字符放入空位(" “)中。
第一个玩家总是放字符"O”,且第二个玩家总是放字符"X"。
"X"和"O"只允许放置在空位中,不允许对已放有字符的位置进行填充。
当有N个相同(且非空)的字符填充任何行、列或对角线时,游戏结束,对应该字符的玩家获胜。
当所有位置非空时,也算为游戏结束。
如果游戏结束,玩家不允许再放置字符。
如果游戏存在获胜者,就返回该游戏的获胜者使用的字符(“X"或"O”);如果游戏以平局结束,则返回 “Draw”;如果仍会有行动(游戏未结束),则返回 “Pending”。

示例 1:

输入: board = ["O X"," XO","X O"]
输出: "X"

示例 2:

输入: board = ["OOX","XXO","OXO"]
输出: "Draw"
解释: 没有玩家获胜且不存在空位

示例 3:

输入: board = ["OOX","XXO","OX "]
输出: "Pending"
解释: 没有玩家获胜且仍存在空位

提示:

1 <= board.length == board[i].length <= 100
输入一定遵循井字棋规则

解题思路

思路1:最直观的想法是,模拟。首先分别统计X字符和O字符的个数,然后分别判断X和O是否获胜,最后判断棋盘是否填充完毕。判断是否获胜,可以依次判断全行、全列、正对角线、副对角线。

class Solution {
public:
    bool iswin(vector<string>& board,char ch,int n)
    {
        //是否存在一行全是
        for(int i=0;i<n;i++)
        {
            int j;
            for(j=0;j<n;j++)
            {
                if(board[i][j]!=ch)
                    break;
            }
            if(j==n)
                return true;
        }
        //是否存在一列全是
        for(int j=0;j<n;j++)
        {
            int i;
            for(i=0;i<n;i++)
            {
                if(board[i][j]!=ch)
                    break;
            }
            if(i==n)
                return true;
        }
        //是否存在正对角线全是
        int i,j;
        for(i=0,j=0;i<n&&j<n;i++,j++)
        {
            if(board[i][j]!=ch)
                break;
        }
        if(i==n&&j==n)
            return true;
        //是否存在副对角线全是
        for(i=0,j=n-1;i<n&&j>=0;i++,j--)
        {
            if(board[i][j]!=ch)
                break;
        }
        if(i==n&&j==-1)
            return true;
        return false;
    }
    string tictactoe(vector<string>& board) {
        int n=board.size();
        int countX=0,countO=0;
        //遍历填充的X和O数量
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<n;j++)
            {
                if(board[i][j]=='X')
                    countX++;
                else if(board[i][j]=='O')
                    countO++;
            }
        }
        //判断是否是X赢了游戏
        if(iswin(board,'X',n))
            return "X";
        //判断是否是O赢了游戏
        if(iswin(board,'O',n))
            return "O";
        //没人获胜且填充完
        if(countX+countO==n*n)
            return "Draw";
        return "Pending";
    }
};

总结:模拟最重要的是注意边界条件的判断。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_43779149/article/details/131019608