C语言牛客网题目--井字棋代码详解

井字棋

KiKi和BoBo玩 "井"字棋。也就是在九宫格中,只要任意行、列,或者任意对角线上面出现三个连续相同的棋子,就能获胜。请根据棋盘状态,判断当前输赢。

输入描述:

三行三列的字符元素,代表棋盘状态,字符元素用空格分开,代表当前棋盘,其中元素为K代表KiKi玩家的棋子,为O表示没有棋子,为B代表BoBo玩家的棋子。

输出描述:

如果KiKi获胜,输出"KiKi wins!";

如果BoBo获胜,输出"BoBo wins!";

如果没有获胜,输出"No winner!"。

示例1

输入:

K O B

O K B

B O K

复制

输出:

KiKi wins!

逻辑分析:

1.首先我们要创建一个3*3的字符二维数组来存储这些棋子

c 复制代码
char arr[3][3] = { 0 };//将数组初始化为0

2.接着就是定义 i 和 j 两个变量,用两层for循环来接收棋子。

这里需要注意的是,我们每次在输完一个字符后都会敲一下回车,也就是\n,当字符被拿走之后,\n还会呆在缓冲区里,然后在输出的时候,程序就会把\n也当作一个字符拿走,这样一来我们的程序就会出问题。

解决:我们可以在输入时在%c的前面加一个空格,每次落下的回车就会被自动消耗了,顺利帮我们解决了这个问题。

c 复制代码
int i = 0;
int j = 0;
for (i = 0; i < 3; i++)
{
    for (j = 0; j < 3; j++)
    {
        scanf(" %c", &arr[i][j]);
    }//输入时%c前面记得加空格
    
}

3.在数组元素全部输入完后,我们就要去判断输赢了,判断输赢无非就是3种情况

(1)一行元素全都相等

(2)一列元素全都相等

以上这两种情况我们都需要用循环去搞定,因为我们一共要检查3行,3列,需要用一个for循环。

然后我们需要搞清楚赢的人是谁,如果有连续的三个'K'连成一行或一列或对角线,那就是KiKi赢;如果有连续的三个'B'连成一行或一列或对角线,那就是BoBo赢;那我们可以定义一个变量flag,因为字符o在题中表示没有棋子,那我们就将其初始化为o.

如果一行的三个元素都相等,那我们直接将其中的任意一个元素赋给flag,如果是三个K,那flag='K',则表示KiKi赢;如果是三个B,那flag='B',则表示BoBo赢;否则就是没有人获胜的情况,输出"No winner!".

c 复制代码
    //判断是谁赢
    //判断行
    char flag = 'o';
    for (i = 0; i < 3; i++)
    {
        if (arr[i][0] == arr[i][1] && arr[i][1] == arr[i][2] && arr[i][1] != 'o')
        {
            flag = arr[i][0];
            break;//如果有人获胜就直接break跳出循环
        }
        //判断列
        if (arr[0][i] == arr[1][i] && arr[1][i] == arr[2][i] && arr[1][i] != 'o')
        {
            flag = arr[0][i];
            break;
        }
    }

(3)还有第三种情况就是两条对角线,这个我们分别去判断就好了:

c 复制代码
 //判断对角线
 if (arr[0][0] == arr[1][1] && arr[1][1] == arr[2][2] && arr[0][0] != 'o')
 {
     flag = arr[0][0];
 }

 if (arr[0][2] == arr[1][1] && arr[1][1] == arr[2][0] && arr[0][2] != 'o')
 {
     flag = arr[0][2];
 }

4.还有最后一步就是根据flag 的值去判断谁是赢家,输出题中对应的文本就可以了:

c 复制代码
   if (flag == 'K')
   {
       printf("KiKi wins!\n");
   }
   else if (flag == 'B')
   {
       printf("BoBo wins!\n");
   }
   else {
       printf("No winner!");
   }

最后为大家附上完整的代码:

c 复制代码
#define  _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main() {
    char arr[3][3] = { 0 };
    int i = 0;
    int j = 0;
    for (i = 0; i < 3; i++)
    {
        for (j = 0; j < 3; j++)
        {
            scanf(" %c", &arr[i][j]);
        }
    }
    
    //判断行
    char flag = 'o';
    for (i = 0; i < 3; i++)
    {
        if (arr[i][0] == arr[i][1] && arr[i][1] == arr[i][2] && arr[i][1] != 'o')
        {
            flag = arr[i][0];
            break;
        }
        //判断列
        if (arr[0][i] == arr[1][i] && arr[1][i] == arr[2][i] && arr[1][i] != 'o')
        {
            flag = arr[0][i];
            break;
        }
    }
    //判断对角线
    if (arr[0][0] == arr[1][1] && arr[1][1] == arr[2][2] && arr[0][0] != 'o')
    {
        flag = arr[0][0];
    }

    if (arr[0][2] == arr[1][1] && arr[1][1] == arr[2][0] && arr[0][2] != 'o')
    {
        flag = arr[0][2];
    }
    //判断是谁赢
    if (flag == 'K')
    {
        printf("KiKi wins!\n");
    }
    else if (flag == 'B')
    {
        printf("BoBo wins!\n");
    }
    else {
        printf("No winner!");
    }
    return 0;
}
相关推荐
luckys.one3 小时前
第9篇:Freqtrade量化交易之config.json 基础入门与初始化
javascript·数据库·python·mysql·算法·json·区块链
~|Bernard|4 小时前
在 PyCharm 里怎么“点鼠标”完成指令同样的运行操作
算法·conda
战术摸鱼大师4 小时前
电机控制(四)-级联PID控制器与参数整定(MATLAB&Simulink)
算法·matlab·运动控制·电机控制
Christo34 小时前
TFS-2018《On the convergence of the sparse possibilistic c-means algorithm》
人工智能·算法·机器学习·数据挖掘
鹿鹿学长5 小时前
2025年全国大学生数学建模竞赛(C题) 建模解析|婴儿染色体数学建模|小鹿学长带队指引全代码文章与思路
c语言·开发语言·数学建模
好家伙VCC5 小时前
数学建模模型 全网最全 数学建模常见算法汇总 含代码分析讲解
大数据·嵌入式硬件·算法·数学建模
伴杯猫5 小时前
【ESP32-IDF】基础外设开发2:系统中断矩阵
c语言·单片机·嵌入式硬件·mcu·物联网·github
liulilittle7 小时前
IP校验和算法:从网络协议到SIMD深度优化
网络·c++·网络协议·tcp/ip·算法·ip·通信
Want5957 小时前
C/C++圣诞树①
c语言·开发语言·c++
bkspiderx8 小时前
C++经典的数据结构与算法之经典算法思想:贪心算法(Greedy)
数据结构·c++·算法·贪心算法